我正在实现HTTP代理。有时,当浏览器通过我的代理发出请求时,会收到错误,例如ECONNRESET
,Address not found
等。这些表示HTTP级别以下的错误。我不是在谈论程序中的错误 - 但是当我向他们发送HTTP请求时,其他服务器的行为如何。
某些服务器可能根本不存在,其他服务器关闭套接字,还有一些服务器根本没有应答。
向呼叫者报告这些错误的最佳方法是什么?是否有一种标准方法,如果我使用它,浏览器会将我的HTTP消息转换为适当的错误消息? (即他们收到来自代理人的回复,告诉他们ECONNRESET
,他们表现得好像他们自己收到了ECONNRESET
。
如果没有,应该如何处理?
我真的希望我的代理完全透明,并且浏览器或其他客户端的工作方式与未连接它的方式完全相同,因此我想复制ECONNRESET
等错误的有机行为发送带有错误代码的HTTP消息,这将是完全不同的行为。
我有点认为这是编写HTTP代理时的意图。
答案 0 :(得分:1)
有几点需要牢记。
首先,如果客户端配置为使用代理(实际上我推荐),那么从根本上说它的行为将与通过Internet直接连接的方式不同。这对用户来说几乎是不可见的,但会影响以下内容:
如果报告错误,如果浏览器无法连接到代理,或者通过代理打开隧道,浏览器将显示连接错误,但对于上游错误,代理将提供页面(根据错误,例如,如果已经发送了响应,则代理可以做很多事情但是关闭连接)。此页面看起来不像浏览器页面那样。
如果浏览器未配置为使用代理,则您需要转移或拦截与代理的连接。如果您决定要针对代理验证用户身份(识别它们/实现特定于用户的规则等),这可能会导致问题。
其次,HTTPS可能是一个真正的痛苦。随着越来越多的站点仅迁移到HTTPS,此问题也在不断增加。有几个问题:
配置为使用代理的浏览器,对于HTTPS URLS将首先使用CONNECT方法通过代理打开隧道。如果您的代理希望阻止此操作,则浏览器会忽略它在块响应中提供的任何信息,而是获得通用浏览器连接错误页面。
如果您想提供代理通常希望获得的任何其他好处(例如缓存/扫描等),您需要实施MitM(中间人)和欺骗服务器SSL证书等。事实上,如果你只想发回一个块页来否认事情,你需要这样做。
有一种方法可以使浏览器更像是通过代理直接连接,而且使用SOCKS。如果出现上游连接错误,SOCKS可以返回错误代码。但它不是实际的套接字错误代码。
这些都是我们编写WinGate Internet Client的原因,WinGate Internet Client是我们的产品WinGate的基于LSP的产品。然后,客户端应用程序将学习实际的上游错误代码等。
现在它不是一种受欢迎的方法,因为它需要在客户端计算机上安装软件。
答案 1 :(得分:0)
我不会向他们提供太多信息。如果必须解决问题,请通过内部日志报告所需内容。返回400,403或418.为什么?也许这只是黑客攻击。