/** * Copyright 2014 ArcBees Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.arcbees.vcs.util; import java.io.IOException; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.protocol.RequestAcceptEncoding; import org.apache.http.client.protocol.ResponseContentEncoding; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import jetbrains.buildServer.version.ServerVersionHolder; public class HttpClientWrapperImpl implements HttpClientWrapper { private static final int RETRY_COUNT = 3; private static final int TIMEOUT = 30 * 1000; private final HttpClient httpClient; private PoolingHttpClientConnectionManager connectionManager; public HttpClientWrapperImpl() { httpClient = initHttpClient(); } private CloseableHttpClient initHttpClient() { RequestConfig requestConfig = getRequestConfig(); String serverVersion = ServerVersionHolder.getVersion().getDisplayVersion(); connectionManager = new PoolingHttpClientConnectionManager(); return HttpClientBuilder.create() .useSystemProperties() .addInterceptorFirst(new RequestAcceptEncoding()) .addInterceptorFirst(new ResponseContentEncoding()) .setRetryHandler(new DefaultHttpRequestRetryHandler(RETRY_COUNT, true)) .setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig) .setUserAgent("JetBrains TeamCity " + serverVersion) .build(); } private RequestConfig getRequestConfig() { return RequestConfig.custom() .setConnectTimeout(TIMEOUT) .setSocketTimeout(TIMEOUT) .build(); } public HttpResponse execute(HttpUriRequest request) throws IOException { try { return httpClient.execute(request); } catch (IOException e) { request.abort(); throw e; } } public void shutdown() { connectionManager.shutdown(); } }