Skip to content

Instantly share code, notes, and snippets.

@adammw
Created September 28, 2011 08:34
Show Gist options
  • Select an option

  • Save adammw/1247377 to your computer and use it in GitHub Desktop.

Select an option

Save adammw/1247377 to your computer and use it in GitHub Desktop.
var http = require('http'),
net = require('net'),
url = require('url'),
util = require('util');
var server = http.createServer();
server.listen(8080);
server.on('request', function(request, response) {
console.log(request);
try {
var parsedUrl = url.parse(request.url);
} catch(e) {
response.writeHead(400);
response.end('URL Not Valid');
return;
}
if (parsedUrl.hostname == 'webfiddler') {
response.end('Hello, welcome to webfiddler');
} else {
var proxyRequest = http.request({
host: parsedUrl.hostname,
port: parsedUrl.port || 80,
method: request.method,
path: (parsedUrl.pathname || "/") + (parsedUrl.search || ""),
headers: request.headers
}, function(proxyResponse) {
response.writeHead(proxyResponse.statusCode, proxyResponse.headers);
util.pump(proxyResponse, response);
});
proxyRequest.on('error', function(e) {
response.writeHead(504);
response.end("504 Gateway Timeout");
});
util.pump(request,proxyRequest);
request.on('close', function(err) {
proxyRequest.abort();
});
}
});
server.on('checkContinue', function(request, response) {
console.log('Expect: 100-continue recieved', request);
response.writeHead(400);
response.end("400 Bad Request");
});
server.on('upgrade', function(request, socket, head) {
if (request.method == 'CONNECT') {
try {
var parsedUrl = (function(url) {
var splitUrl = url.split(':');
if (splitUrl.length != 2) throw Error();
return {port: splitUrl[1], hostname: splitUrl[0]};
})(request.url);
} catch(e) {
socket.write("HTTP/1.1 400 Bad Request\r\n\r\n");
socket.end();
return;
}
if (parsedUrl.port != 443) {
socket.write("HTTP/1.1 400 Bad Request\r\n\r\n");
socket.end();
return;
}
var proxySocket = net.createConnection(parsedUrl.port, parsedUrl.hostname);
proxySocket.on('connect', function() {
socket.write("HTTP/1.0 200 Connection established\r\n\r\n");
util.pump(socket, proxySocket);
util.pump(proxySocket, socket);
});
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment