All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.databricks.sdk.core.commons.CommonsHttpClient Maven / Gradle / Ivy

package com.databricks.sdk.core.commons;

import com.databricks.sdk.core.http.HttpClient;
import com.databricks.sdk.core.http.Request;
import com.databricks.sdk.core.http.Response;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

public class CommonsHttpClient implements HttpClient {
  private final PoolingHttpClientConnectionManager connectionManager =
      new PoolingHttpClientConnectionManager();
  private final CloseableHttpClient hc;
  private int timeout;

  public CommonsHttpClient(int timeoutSeconds) {
    timeout = timeoutSeconds * 1000;
    connectionManager.setMaxTotal(100);
    hc = makeClosableHttpClient();
  }

  private RequestConfig makeRequestConfig() {
    return RequestConfig.custom()
        .setConnectionRequestTimeout(timeout)
        .setConnectTimeout(timeout)
        .setSocketTimeout(timeout)
        .build();
  }

  private CloseableHttpClient makeClosableHttpClient() {
    return HttpClientBuilder.create()
        .setConnectionManager(connectionManager)
        .setDefaultRequestConfig(makeRequestConfig())
        .build();
  }

  @Override
  public Response execute(Request in) throws IOException {
    HttpUriRequest request = transformRequest(in);
    in.getHeaders().forEach(request::setHeader);
    try (CloseableHttpResponse response = hc.execute(request)) {
      HttpEntity entity = response.getEntity();
      StatusLine statusLine = response.getStatusLine();
      Map> hs =
          Arrays.stream(response.getAllHeaders())
              .collect(
                  Collectors.groupingBy(
                      NameValuePair::getName,
                      Collectors.mapping(NameValuePair::getValue, Collectors.toList())));
      String body = null;
      if (entity != null) {
        try (InputStream inputStream = entity.getContent()) {
          body = IOUtils.toString(inputStream, Charset.defaultCharset());
        }
      }
      return new Response(in, statusLine.getStatusCode(), statusLine.getReasonPhrase(), hs, body);
    }
  }

  private HttpUriRequest transformRequest(Request in) {
    switch (in.getMethod()) {
      case Request.GET:
        return new HttpGet(in.getUri());
      case Request.DELETE:
        return new HttpDelete(in.getUri());
      case Request.POST:
        return withEntity(new HttpPost(in.getUri()), in.getBody());
      case Request.PUT:
        return withEntity(new HttpPut(in.getUri()), in.getBody());
      case Request.PATCH:
        return withEntity(new HttpPatch(in.getUri()), in.getBody());
      default:
        throw new IllegalArgumentException("Unknown method: " + in.getMethod());
    }
  }

  private HttpRequestBase withEntity(HttpEntityEnclosingRequestBase request, String body) {
    try {
      request.setEntity(new StringEntity(body));
      return request;
    } catch (UnsupportedEncodingException e) {
      throw new IllegalArgumentException(e);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy