Node.js - Create a proxy, why is request.pipe needed?
node.js
Solution
What am I missing here? [...] the http.request method already makes the request contained in the options var.
`http.request()` doesn't actually send the request in its entirety immediately:
[...] With `http.request()` one must always call `req.end()` to signify that you're done with the request - even if there is no data being written to the request body.
The `http.ClientRequest` it creates is left open so that body content, such as JSON data, can be written and sent to the responding server:
var req = http.request(options);
req.write(JSON.stringify({
// ...
}));
req.end();
`.pipe()` is just one option for this, when you have a readable stream, as it will `.end()` the client request by default.
Although, since `GET` requests rarely have a body that would need to be piped or written, you can typically use `http.get()` instead, which calls `.end()` itself:
Since most requests are GET requests without bodies, Node provides this convenience method. The only difference between this method and `http.request()` is that it sets the method to GET and calls `req.end()` automatically.
http.get(options, function (res) {
res.pipe(response, {
end: true
});
});
Problem
Can some one explain this code to create a proxy server. Everything makes sense except the last block. request.pipe(proxy - I don't get that because when proxy is declared it makes a request and pipes its response to the clients response. What am I missing here? Why would we need to pipe the original request to the proxy because the http.request method already makes the request contained in the options var. ``` var http = require('http'); function onRequest(request, response) { console.log('serve: ' + request.url); var options = { hostname: 'www.google.com', port: 80, path: request.url, method: 'GET' }; var proxy = http.request(options, function (res) { res.pipe(response, { end: true }); }); request.pipe(proxy, { end: true }); } http.createServer(onRequest).listen(8888); ```