Proxy 환경에서 HttpsUrlConnection 통신으로 POST Method 전송 시, 1회 성공 후 retry 시 실패하는 오류가 있다.
이 때 실패는 서버 측에서 Header 에 담긴 Length 만큼 Body 가 오지 않아, 끝까지 기다리다 Socket Timeout 나는 오류이다.
현상은 1회 성공, 1회 실패, 1회 성공, 1회 실패를 반복하게 되는데 해결 방안은 여러 가지가 있다.
URL url = new URL( "https://example.com/api/test");
SocketAddress socket = new InetSocketAddress("IP Addr",8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, socket);
HttpsUrlConnection urlConnection = url.openConnection(proxy);
urlConnection.setRequestMethod("POST");
동일한 환경이라도 모든 POST 요청 시 재현되는 것은 아니고, Request Body 중 공백이 포함되는 Case 에서 발생하는 것으로 보인다.
필자의 재현된 Case 는 Body 에 JSONArray + JSONObject 로 구성된 String 을 설정했을 경우에 발생했다.
위의 경우, 아래와 같이 Stable 한 http client 라이브러리를 사용하여 해결할 수 있었다. (ex. apache httpclient-4.4.x.jar)
다른 해결방법으로 참고 링크에 나온 JDK 최신 버전으로 업그레이드도 있을 수 있다.
HttpHost proxy = new HttpHost(proxyIp, proxyPort);
DefaultProxyPlanner router = new DefaultProxyRoutePlanner(proxy);
HttpClient client = HttpClient.custom()
.setRoutePlanner(router)
.build();
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(timeout)
.build();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "application/json");
httpPost.setEntity(new StringEntity(jsonString));
httpPost.setConfig(config);
HttpResponse response = client.execute(httpPost);