У меня есть приложение, построенное поверх Spring MVC.
Я хочу написать простой прокси-сервер, обрабатывающий запросы следующим образом:
- отправить тот же HTTP-запрос на определенный сервер
- захватить HTTP-ответ с этого конкретного сервера
- вернуть тот же ответ запрашивающему клиенту
Вот что я получил до сих пор:
public void proxyRequest(HttpServletRequest request, HttpServletResponse response) {
try {
HttpUriRequest proxiedRequest = createHttpUriRequest(request);
HttpResponse proxiedResponse = httpClient.execute(proxiedRequest);
writeToResponse(proxiedResponse, response);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void writeToResponse(HttpResponse proxiedResponse, HttpServletResponse response){
for(Header header : proxiedResponse.getAllHeaders()){
response.addHeader(header.getName(), header.getValue());
}
OutputStream os = null;
InputStream is = null;
try {
is = proxiedResponse.getEntity().getContent();
os = response.getOutputStream();
IOUtils.copy(is, os);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private HttpUriRequest createHttpUriRequest(HttpServletRequest request) throws URISyntaxException{
URI uri = new URI(geoserverConfig.getUrl()+"/wms?"+request.getQueryString());
RequestBuilder rb = RequestBuilder.create(request.getMethod());
rb.setUri(uri);
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
rb.addHeader(headerName, headerValue);
}
HttpUriRequest proxiedRequest = rb.build();
return proxiedRequest;
}
Он работает нормально, но не во всех случаях. Я проверил в мониторе сети Chrome, и некоторые из запросов, которые используют этот прокси, не удалось.
Ниже приведены заголовки запроса с запросом неудачного запроса:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: inline; filename=JEDN_EWID.png
Transfer-Encoding: chunked
Date: Thu, 16 Jul 2015 10:31:49 GMT
Content-Type: image/png;charset=UTF-8
Content-Length: 6727
Вот заголовки ответа на успешный запрос образца:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: inline; filename=JEDN_EWID.png
Transfer-Encoding: chunked
Date: Thu, 16 Jul 2015 10:31:49 GMT
Content-Type: image/png;charset=UTF-8
Transfer-Encoding: chunked
Чем больше Chrome выдает сообщение об ошибке в консоли:
GET http://localhost:8080/<rest of url> net::ERR_INVALID_CHUNKED_ENCODING
Запросами, которые я проксимирую, являются запросы WMS GetMap, и мой прокси перенаправляет их на скрытый Geoserver. Я заметил, что неудавшиеся запросы должны возвращать прозрачные изображения 512x512.png, которые все пусты. Успешные возвращают изображения 512x512.png, которые не только прозрачны, но также содержат некоторые цвета.