【问题标题】:Node.js http.ServerRequest response never arrivesNode.js http.ServerRequest 响应永远不会到达
【发布时间】:2011-08-22 09:42:48
【问题描述】:

为了好玩,我正在使用 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 从未收到响应。如果我重新启动页面请求,它几乎总是会成功,因为第一次尝试成功获取的所有资源都被缓存了(因此浏览器不会再次尝试获取它们),所以现在浏览器只需要抓取一些丢失的资源那些。

我猜想我会达到某种连接限制,尽管我不确定。任何帮助将不胜感激!

【问题讨论】:

    标签: javascript http node.js reverse-proxy


    【解决方案1】:

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

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

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

    【讨论】:

    • 正确。从 'connection: keep-alive' 更改为 'connection: close' 成功了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多