【问题标题】:How to correctly respond to HTTP CONNECT in Google Chrome如何在 Google Chrome 中正确响应 HTTP CONNECT
【发布时间】:2014-08-30 15:16:33
【问题描述】:

我正在构建一个代理服务器,在收到 HTTP CONNECT 请求后,我建立到目标服务器的连接,如果成功返回

HTTP/1.1 200 Connection established
<<empty line>>

在 Firefox 中,这会导致隧道打开,数据被交换、加载并最终在浏览器中交付/呈现

在谷歌浏览器中,我立即看到:

ERR_TUNNEL_CONNECTION_FAILED

由于服务器似乎在 Firefox 上运行良好,但在 Chrome 上却不行,我只能假设 Chrome 期望得到不同的响应。有谁知道我在这里做错了什么?

编辑:

我在这里发现了this chromium 问题,它描述了相同的症状 - 用户得到 ERR_TUNNEL_CONNECTION_FAILED。我启用了 --log-net-log 命令行参数,可以在日志中看到 ERR_TUNNEL_CONNECTION_FAILED 错误是在收到我的 200 Connection established proxy 响应后直接发生的。

在请求和响应之间,我看到一个 -109 错误,对应于 ADDRESS_UNREACHABLE。

我在下面包含了我认为网络日志相关部分的摘录:

{"params":{"headers":["Host: mail.google.com","Proxy-Connection: keep-alive","User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"],"line":"CONNECT mail.google.com:443 HTTP/1.1\r\n"},"phase":0,"source":{"id":822,"type":5},"time":"331488980","type":125},
{"params":{"headers":["Host: mail.google.com","Proxy-Connection: keep-alive","User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"],"line":"CONNECT mail.google.com:443 HTTP/1.1\r\n"},"phase":0,"source":{"id":822,"type":5},"time":"331488980","type":129},
{"params":{"byte_count":227},"phase":0,"source":{"id":822,"type":5},"time":"331488980","type":61},
{"phase":2,"source":{"id":822,"type":5},"time":"331488981","type":124},
{"phase":1,"source":{"id":822,"type":5},"time":"331488981","type":126},
{"phase":1,"source":{"id":822,"type":5},"time":"331488981","type":207},
{"params":{"address_family":0,"allow_cached_response":true,"host":"mail.google.com:0","is_speculative":false,"source_dependency":{"id":0,"type":0}},"phase":1,"source":{"id":823,"type":8},"time":"331489008","type":4},
{"params":{"source_dependency":{"id":823,"type":8}},"phase":1,"source":{"id":824,"type":21},"time":"331489008","type":299},
{"params":{"source_dependency":{"id":824,"type":21}},"phase":1,"source":{"id":825,"type":14},"time":"331489008","type":34},
{"params":{"address":"[2001:4860:4860::8888]:53"},"phase":1,"source":{"id":825,"type":14},"time":"331489008","type":70},
{"params":{"net_error":-109},"phase":2,"source":{"id":825,"type":14},"time":"331489008","type":70},
{"phase":2,"source":{"id":825,"type":14},"time":"331489008","type":34},
{"phase":2,"source":{"id":824,"type":21},"time":"331489008","type":299},
{"phase":0,"source":{"id":823,"type":8},"time":"331489008","type":6},
{"phase":2,"source":{"id":823,"type":8},"time":"331489008","type":4},
{"params":{"byte_count":74},"phase":0,"source":{"id":822,"type":5},"time":"331489052","type":63},
{"phase":2,"source":{"id":822,"type":5},"time":"331489052","type":207},
{"params":{"headers":["HTTP/1.1 200 Connection established"]},"phase":0,"source":{"id":822,"type":5},"time":"331489052","type":127},
{"params":{"net_error":-111},"phase":2,"source":{"id":822,"type":5},"time":"331489052","type":126},

如果您需要查看更多日志,我已经发布了整个日志here

【问题讨论】:

  • 你解决过这个问题吗?
  • 不完全是,但我开始重新设计我的解决方案,这导致我提出这个问题,这让我需要去哪里。也许它也会帮助你? stackoverflow.com/questions/25188595/…

标签: google-chrome https proxy-server


【解决方案1】:

有点晚了,但我自己也遇到了这个问题。在我的情况下发生的事情是我在 CONNECT 响应中发送了一个额外的字节。 通过在 Chrome 中启用 NetLog(在 Everything 捕获模式下)发现这一点:

--> bytes =
  48 54 54 50 2F 31 2E 31  20 32 30 30 20 43 6F 6E   HTTP/1.1 200 Con
  6E 65 63 74 69 6F 6E 20  65 73 74 61 62 6C 69 73   nection establis
  68 65 64 0D 0A 0D 0A 00                            hed.... 

查看尾随的 00。Chrome(和 curl)似乎是 more strict,而不是 Firefox 或 Safari,因为您发送它的整个缓冲区需要是格式良好的 HTTP 响应。

我建议你 capture a full NetLog dump 并查看 Chrome 正在接收的字节数。

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2018-07-07
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多