2011-08-22 74 views
0

我使用Node.js创建反向HTTP代理以获得乐趣。该代码目前非常简单。它在127.0.0.1:8080上侦听HTTP请求,并将它们转发到hostname.com,然后将hostname.com的响应转发回客户端。没什么特别的完成又比如重写重定向头,等等。代码如下:Node.js http.ServerRequest响应永远不会到达

var http = require('http'); 

var server = http.createServer(
     function(request, response) { 
      var proxy = http.createClient(8080, 'hostname.com') 
      var proxyRequest = proxy.request(request.method, request.url, request.headers); 

     proxyRequest.on('response', function(proxyResponse) { 
      proxyResponse.on('data', function(chunk) { 
       response.write(chunk, 'binary'); 
      }); 
      proxyResponse.on('end', function() { 
       response.end(); 
      }); 
      response.writeHead(proxyResponse.statusCode, proxyResponse.headers); 
     }); 

     request.on('data', function(chunk) { 
      proxyRequest.write(chunk, 'binary'); 
     }); 

     request.on('end', function() { 
      proxyRequest.end(); 
     }); 

     proxyRequest.on('close', function(err) { 
      if (err) { 
       console.log('close error: ' + err + ' for ' + request.url); 
      } 
     }); 

    }); 

server.listen(8080); 
server.on('clientError', function(exception) { 
    console.log('boo a clientError occured :('); 
}); 

所有似乎很好地工作,直到我浏览到需要很多额外的资源(如图像)要获取一个网页。当然,浏览器会向反向代理生成大量的GET请求来获取这些额外的资源。

当我浏览到这样的页面时,其他资源的一些http.ServerRequests永远不会收到响应。如果我重新启动页面请求,几乎总是会成功,因为在第一次尝试时成功获取的所有资源都被缓存(因此浏览器不会再尝试GET),所以现在浏览器只需要抓取几个那些。

在猜测我会想象我打了某种连接限制,虽然我不知道。任何帮助将不胜感激!

回答

0

如果你在代理上设置Wireshark,你几乎肯定会看到发生了什么。 (请注意,你可能需要第二台机器对于这一点,因为某些TCP/IP堆栈不提供任何Wireshark的可以听上环回流量 - 见this

我几乎可以肯定,这个问题( s)你在这里遇到的都是Connection:头 - 代理必须解析这个头并正确处理。猜测,我会说你的代码正在处理Connection: keep-alive流中的第一个请求,并忽略其余部分。作为代理,您应该解析并删除/替换此标头,以及任何关联的标头(在此情况下为Keep-Alive:标头),,然后将请求转发给服务器。

如果你想建立一个HTTP/1.1代理,这是非常重要read RFC 2616和坚持,这对他们的行为的地方很多,很多规则。您遇到的特定问题记录在section 14.10中。

+0

现货。从'连接:保持活跃'变为'连接:关闭'做了诀窍。谢谢! – dbotha

相关问题