http - 实现 Web 代理时,服务器应如何报告低级协议(protocol)错误?

标签 http networking proxy http-proxy

我正在实现 HTTP 代理。有时,当浏览器通过我的代理发出请求时,我会收到诸如 ECONNRESETAddress not found 等错误。这些指示低于 HTTP 级别的错误。我不是在谈论我的程序中的错误——而是在我向它们发送 HTTP 请求时其他服务器的行为。

有些服务器可能根本不存在,有些服务器关闭套接字,还有一些服务器根本不响应。

向调用者报告这些错误的最佳方式是什么?有没有一种标准方法,如果我使用它,浏览器会将我的 HTTP 消息转换为适当的错误消息? (即他们从代理那里得到一个回复​​,告诉他们 ECONNRESET,并且他们表现得好像他们自己收到了 ECONNRESET)。

如果不是,应该如何处理?

动机

我真的希望我的代理是完全透明的,浏览器或其他客户端就像没有连接到它一样工作,所以我想复制错误的有机行为,例如 ECONNRESET 而不是发送带有错误代码的 HTTP 消息,这将是完全不同的行为。

我有点认为这是编写 HTTP 代理时的意图。

最佳答案

有几点需要牢记。

首先,如果客户端配置为使用代理(实际上我会推荐),那么从根本上讲,它的行为将不同于直接通过 Internet 连接。这对用户来说几乎是不可见的,但会影响以下内容:

  • FTP 网址
  • 一些缓存差异
  • 如果需要,对代理进行身份验证
  • 报告连接错误等<=您的问题。

在报告错误的情况下,如果浏览器无法连接到代理或通过代理打开隧道,浏览器将显示连接错误,但对于上游错误,代理将提供一个页面(取决于错误,例如,如果已经发送了响应,则代理只能关闭连接。此页面看起来与您的浏览器页面完全不同。

如果浏览器未配置为使用代理,则您需要转移或拦截与代理的连接。如果您决定要根据代理对用户进行身份验证(以识别他们/实现用户特定的规则等),这可能会导致问题。

其次,HTTPS 可能会让人头疼。随着越来越多的网站转向仅使用 HTTPS,这个问题越来越严重。有几个问题:

  • 配置为使用代理的浏览器,对于 HTTPS URLS,将首先使用 CONNECT 方法通过代理打开隧道。如果您的代理想要阻止这种情况,那么它在 block 响应中提供的任何信息都会被浏览器忽略,而您会看到通用的浏览器连接错误页面。

  • 如果您想提供通常希望从代理获得的任何其他好处(例如缓存/扫描等),您需要实现 MitM(中间人)和欺骗服务器 SSL 证书等。在事实上,如果您只想发回一个阻止页面来拒绝某些事情,您需要这样做。

有一种方法可以让浏览器更像是通过代理直接连接,这就是使用 SOCKS。如果存在上游连接错误,SOCKS 有办法返回错误代码。然而,这不是实际的套接字错误代码。

这些都是我们编写 WinGate Internet Client 的原因,它是我们产品 WinGate 的基于 LSP 的产品。然后客户端应用程序了解实际的上游错误代码等。

不过现在这不是一种受欢迎的方法,因为它需要在客户端计算机上安装软件。

关于http - 实现 Web 代理时,服务器应如何报告低级协议(protocol)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48733959/

相关文章:

c# - AngularJS 下拉列表在选择项目后丢失内容

angular - 如何将 ionic http GET 请求从@angular\Http 转换为@ion-native\Http?

android - 如何编写一个 android 测试来验证我的应用是否命中所有必需的 api

java - 创建多重继承的java代理时出现ClassFormatError?

API 设计 - 用 400 响应有用错误消息的最佳方式是什么?

linux - 如何在 shell 脚本中获取我的公共(public) IP 地址?

networking - 字节中的位顺序重要吗?

c++ linux - 从IP获取接口(interface)

apache - 如何使用反向代理确保与外部服务器的安全连接?

C# - 执行200个http get请求并输出结果