2016-05-07 4 views
1

Я построил обратный прокси (P) на восходящем сервере (U). Клиентское приложение (C) выдаст запрос P, который, в свою очередь, выдает запрос U, и результат, возвращаемый U, должен быть возвращен клиенту C по доверенности P.Джерси 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 тоже - как насчет печенья, например?

+0

Это точно моя точка зрения - я не хочу этого делать, я просто хотел бы сделать «return updstreamResponse», в котором есть все, о чем вы уже упоминали, и мне не нужно было ничего делать. – wujek

+0

Я не думаю, что вы сможете получить это - прокси-сервер - это немного специализированный прецедент. Но я мог видеть довольно простой метод для копирования, как вы хотите. Вы даже можете сделать так, как и многие прокси, и добавить заголовок, чтобы указать, какой IP, например, запрос был отправлен. Но в целом, я думаю, вам придется сворачивать самостоятельно. – stdunbar

+0

Только одно примечание - я не пишу полноценный прокси-сервер общего назначения; Я пишу небольшую утилиту для моего особо специализированного случая использования. Но я до сих пор не знаю, почему я не могу просто вернуть все, что приходит от восходящего ресурса, должно быть что-то есть, например, заголовок или sth, который разбивает поток. – wujek

Смежные вопросы