Javascript Node.js http.ServerRequest响应从未到达

Javascript Node.js http.ServerRequest响应从未到达,javascript,http,node.js,reverse-proxy,Javascript,Http,Node.js,Reverse Proxy,为了好玩,我正在使用Node.js创建一个反向HTTP代理。目前代码非常简单。它在127.0.0.1:8080上侦听HTTP请求并将这些请求转发到hostname.com,然后将来自hostname.com的响应转发回客户端。尚未完成任何操作,例如重写重定向头等。代码如下所示: var http = require('http'); var server = http.createServer( function(request, response) {

为了好玩,我正在使用Node.js创建一个反向HTTP代理。目前代码非常简单。它在127.0.0.1:8080上侦听HTTP请求并将这些请求转发到hostname.com,然后将来自hostname.com的响应转发回客户端。尚未完成任何操作,例如重写重定向头等。代码如下所示:

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.server请求从未收到响应。如果我重新启动页面请求,它几乎总是会成功,因为在第一次尝试时成功获取的所有资源都被缓存,因此浏览器不会再次尝试获取它们,因此现在浏览器只需要获取一些缺少的资源


在一个猜测中,我会想象我正在达到某种连接限制,尽管我不确定。任何帮助都将不胜感激

如果您在代理上设置Wireshark,您几乎肯定会看到发生了什么。请注意,您可能需要另一台机器来完成此操作,因为某些TCP/IP堆栈不提供Wireshark可以监听的任何环回流量-请参阅

我几乎可以肯定,您在这里遇到的问题都与连接有关:头代理必须解析这个头并正确处理它。猜测一下,我会说您的代码正在处理连接中的第一个请求:保持活动流而忽略其余的请求。作为代理,在将请求转发到服务器之前,您应该解析并删除/替换此头以及任何相关头(在本例中为Keep-Alive:header)


如果您想构建一个HTTP/1.1代理,那么您必须遵守它对其行为所规定的许多规则,这一点非常重要。您在此处遇到的特定问题记录在。

现场。将“连接:保持活动状态”更改为“连接:关闭”成功。谢谢