Proxy 什么';这是重试失败的代理请求的正确方法

Proxy 什么';这是重试失败的代理请求的正确方法,proxy,jetty,Proxy,Jetty,我有一个代理servlet,它是使用Jetty的AsyncProxyServlet.Transparent(Jetty 9)实现的。由于远程服务器有时关闭连接的方式,代理请求偶尔会失败,并出现早期异常。在这些情况下,我希望代理代表客户端重试请求,而不是返回502状态响应。正确的方法是什么 我假设我需要重写AbstractProxyServlet的onProxyResponseFailure方法并实现我自己的错误处理,但我不确定如何创建和发送新的代理请求,并将其与来自客户端的原始请求相关联。使用A

我有一个代理servlet,它是使用Jetty的AsyncProxyServlet.Transparent(Jetty 9)实现的。由于远程服务器有时关闭连接的方式,代理请求偶尔会失败,并出现早期异常。在这些情况下,我希望代理代表客户端重试请求,而不是返回502状态响应。正确的方法是什么


我假设我需要重写AbstractProxyServlet的
onProxyResponseFailure
方法并实现我自己的错误处理,但我不确定如何创建和发送新的代理请求,并将其与来自客户端的原始请求相关联。

使用AsyncProxyServlet进行代理重试是不可行的

浏览器HTTP交换和代理HTTP交换的异步性质意味着它们在hip上相互绑定

如果一个失败,两个都会自动失败。 重试非常困难,因为浏览器HTTP交换已经提交并且部分完成

实际上,浏览器HTTP交换需要挂起,然后代理HTTP交换需要重新启动,从零开始,然后您需要在代理端“赶上”交换,直到您在浏览器端。一旦你赶上了,你必须调整代理响应以匹配浏览器响应的技术(如已知内容长度、gzip状态、分块等)

如果代理响应在请求之间发生变化,即使是以较小的方式(响应头、大小、压缩、内容等)也会使问题变得更加复杂


完成重试的唯一方法是不使用异步,而是在向客户端发送响应之前使用代理响应的完全缓存(但这实际上比异步代理技术更难实现,因为您必须处理复杂的内存、http缓存和超时问题)

这并不是我所希望的答案,但谢谢你帮我省去了自己想办法解决这个问题的麻烦。