我为上游服务器(U)构建了一个反向代理(P)。客户端应用程序(C)将向P发出请求,P将向U发出请求,U返回的结果应由代理P返回给客户端C.
当我像这样用P编写代码时(我希望代理尽可能通用,并支持多种结果类型):
Client client = // get the client
Invocation.Builder builder = // configure the call to U
return builder.get(InputStream.class);
它适用于JSON和二进制数据,返回结果,但Content-Type
标头始终设置为application/octet-stream
,这是错误的。我可以从U中检查类型的结果并将其设置为来自我的代理P的响应,但随后我将不得不处理错误处理等等。而当我只是返回InputStream并发生错误时,{{ 1}}方法抛出异常,然后传播到客户端。
我实际上只想接受U返回的Response并将其用作P的返回值,如下所示:
builder.get()
客户端C,在我的情况下是Python 3 Client client = // get the client
Invocation.Builder builder = // configure the call to U
return builder.get(); // returns Response
应用程序,得到以下错误:
requests
我尝试了以下代码:
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
但是,唉,结果是一样的。
我错过了什么?
答案 0 :(得分:1)
我原本希望代理通过内容类型(也可能是内容长度和状态等)。所以看起来会更像:
Response upstreamResponse = client./* code code */.get();
upstreamResponse.bufferEntity();
return Response.status(upstreamResponse.status())
.type(upstreamResponse.getMediaType()
// and so on
实际上,您可能也可能不想要来自upstreamResponse标题的许多内容 - 例如Cookies怎么样?