Proxy HttpsUrlConnection 오류

Mong Developer·2022년 2월 10일
0

Bug 내용

Proxy 환경에서 HttpsUrlConnection 통신으로 POST Method 전송 시, 1회 성공 후 retry 시 실패하는 오류가 있다.
이 때 실패는 서버 측에서 Header 에 담긴 Length 만큼 Body 가 오지 않아, 끝까지 기다리다 Socket Timeout 나는 오류이다.
현상은 1회 성공, 1회 실패, 1회 성공, 1회 실패를 반복하게 되는데 해결 방안은 여러 가지가 있다.

사용 Code

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");

Case & Solution

동일한 환경이라도 모든 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);

참고

JDK Bug Report

profile
골프, 영화, 만화, 경제, 정치, 투자, 당구 등 여러가지 분야에 관심만 많은 개발자입니다. :)

0개의 댓글