0

i'm trying to implement simple anonymous http proxy server in nodejs

var http = require('http'),
    request = require('request');
http.createServer(function(req,res){
    req.pipe(request(req.url)).pipe(res)
}).listen(8888)

i'm recieving the following error:

stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
Error: CERT_HAS_EXPIRED
    at SecurePair.<anonymous> (tls.js:1370:32)
    at SecurePair.EventEmitter.emit (events.js:92:17)
    at SecurePair.maybeInitFinished (tls.js:982:10)
    at CleartextStream.read [as _read] (tls.js:469:13)
    at CleartextStream.Readable.read (_stream_readable.js:320:10)
    at EncryptedStream.write [as _write] (tls.js:366:25)
    at doWrite (_stream_writable.js:226:10)
    at writeOrBuffer (_stream_writable.js:216:5)
    at EncryptedStream.Writable.write (_stream_writable.js:183:11)
    at write (_stream_readable.js:583:24)
    at flow (_stream_readable.js:592:7)
    at Socket.pipeOnReadable (_stream_readable.js:624:5)

Here is another error:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: Invalid protocol

Any suggestions?

2 Answers 2

3

req.url is a relative path, not a full url. It means that you should add protocol and domain name to it:

req.pipe(request('http://mydomain.com'+req.url)).pipe(res)

You're also forgetting about req.method and req.headers:

req.pipe(request({
  url: 'http://mydomain.com'+req.url,
  method: req.method,
  headers: req.headers
})).pipe(res)

If your purpose is to use it as a real proxy server, then I would recommend you to look at node-http-proxy - it's a perfect node.js proxy server implementation.

If you just want to learn node.js, then look at this article with example proxy server implementation. Author of the article is using build-in http module to send request instead of more powerful request module and not using piping, but the rest of the article looks fine.

As for you first problem, Piotr Tomasik's answer should help you.

Sign up to request clarification or add additional context in comments.

Comments

1

Looks like the domain you are hitting has an expired cert.

Add this to the top of your file.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

As for your second error, make sure that the url includes the protocol. http https

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.