2016-05-07 67 views
1

我爲上游服務器(U)構建了反向代理(P)。一個客戶端應用程序(C)將向P發出一個請求,這個請求又會向U發出一個請求,並且由U返回的結果應該由代理P返回給客戶端C.Jersey 2 - 從資源方法返回客戶端響應

當我將代碼寫入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併發生錯誤時,方法builder.get()拋出一個異常然後傳播給客戶端。

我真的想只是採取用U返回的響應,並把它作爲P的返回值,就像這樣:

Client client = // get the client 
Invocation.Builder builder = // configure the call to U 
return builder.get(); // returns Response 

客戶端C,在我的情況一個Python 3 requests應用,得到以下錯誤:

requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',)) 

我嘗試下面的代碼:

Response upstreamResponse = client./* code code */.get(); 
upstreamResponse.bufferEntity(); 
return Response.fromResponse(upstreamResponse); 

但是,唉,結果是一樣的。

我錯過了什麼?

回答

1

我會期望代理傳遞內容類型(也可能是其他內容的長度和狀態)。所以它看起來有點更像:

Response upstreamResponse = client./* code code */.get(); 
upstreamResponse.bufferEntity(); 
return Response.status(upstreamResponse.status()) 
       .type(upstreamResponse.getMediaType() 
       // and so on 

實際上,你可能會或可能不希望從upstreamResponse頭很多的東西太多 - 有什麼關於cookies例如?

+0

這正是我的觀點 - 我不想這樣做,我只想做'返回updstreamResponse',它具有您提到的所有事情,而且我不需要做任何事情。 – wujek

+0

我不認爲你會得到這個 - 代理是一個專門的用例。但我可以看到一個非常簡單的方法來複制你想要的。您甚至可以像許多代理一樣執行操作,並添加一個標頭來指示哪些IP,例如請求已轉發。但總的來說,我認爲你必須推出自己的產品。 – stdunbar

+0

只需要注意一點 - 我不是寫一個完整的通用代理;我正在爲我非常專業的用例寫一個小工具。但是,我仍然不知道爲什麼我不能只是返回來自上游資源的任何內容,而是必須有一些東西,比如頭部或某物,這會破壞流。 – wujek

相關問題