Node.js http.ServerRequest响应永远不会到来

时间:2011-08-22 09:42:48

标签: 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) {
            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永远不会收到响应。如果我重新启动页面请求它几乎总是会导致成功,因为第一次尝试成功获取的所有资源都被缓存(因此浏览器不会尝试再次获取它们)所以现在浏览器只需要抓取一些那些。

猜测我会想象我会遇到某种连接限制,虽然我不确定。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果你在代理上设置Wireshark,你几乎肯定会看到发生了什么。 (请注意,您可能需要第二台计算机,因为某些TCP / IP堆栈不提供Wireshark可以监听环回流量的任何内容 - 请参阅this

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

如果您想构建一个HTTP / 1.1代理,那么非常对您read RFC 2616很重要,并遵守它对其行为的许多规则。您遇到的特定问题记录在section 14.10