Search in sources :

Example 1 with HttpApiConfig

use of org.apache.drill.exec.store.http.HttpApiConfig in project drill by apache.

the class SimpleHttp method setupHttpClient.

/**
 * Configures the OkHTTP3 server object with configuration info from the user.
 *
 * @return OkHttpClient configured server
 */
private OkHttpClient setupHttpClient() {
    Builder builder = new OkHttpClient.Builder();
    // Set up the HTTP Cache.   Future possibilities include making the cache size and retention configurable but
    // right now it is on or off.  The writer will write to the Drill temp directory if it is accessible and
    // output a warning if not.
    HttpStoragePluginConfig config = scanDefn.tableSpec().config();
    if (config.cacheResults()) {
        setupCache(builder);
    }
    HttpApiConfig apiConfig = scanDefn.tableSpec().connectionConfig();
    // If OAuth information is provided, we will assume that the user does not want to use
    // basic authentication
    HttpOAuthConfig oAuthConfig = scanDefn.tableSpec().config().oAuthConfig();
    if (oAuthConfig != null) {
        // Add interceptors for OAuth2
        logger.debug("Adding OAuth2 Interceptor");
        AccessTokenRepository repository = new AccessTokenRepository(proxyConfig, config, tokenTable);
        builder.authenticator(new AccessTokenAuthenticator(repository));
        builder.addInterceptor(new AccessTokenInterceptor(repository));
    } else if (apiConfig.authType().equalsIgnoreCase("basic")) {
        // If the API uses basic authentication add the authentication code.
        logger.debug("Adding Interceptor");
        UsernamePasswordCredentials credentials = apiConfig.getUsernamePasswordCredentials();
        builder.addInterceptor(new BasicAuthInterceptor(credentials.getUsername(), credentials.getPassword()));
    }
    // Set timeouts
    int timeout = Math.max(1, config.timeout());
    builder.connectTimeout(timeout, TimeUnit.SECONDS);
    builder.writeTimeout(timeout, TimeUnit.SECONDS);
    builder.readTimeout(timeout, TimeUnit.SECONDS);
    // Sourced from https://stackoverflow.com/questions/60110848/how-to-disable-ssl-verification
    if (!apiConfig.verifySSLCert()) {
        try {
            TrustManager[] trustAllCerts = getAllTrustingTrustManager();
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            HostnameVerifier verifier = (hostname, session) -> true;
            builder.hostnameVerifier(verifier);
        } catch (KeyManagementException | NoSuchAlgorithmException e) {
            logger.error("Error when configuring Drill not to verify SSL certs. {}", e.getMessage());
        }
    }
    // Set the proxy configuration
    addProxyInfo(builder, proxyConfig);
    return builder.build();
}
Also used : HttpSubScan(org.apache.drill.exec.store.http.HttpSubScan) X509Certificate(java.security.cert.X509Certificate) SSLContext(javax.net.ssl.SSLContext) Cache(okhttp3.Cache) URLDecoder(java.net.URLDecoder) UserException(org.apache.drill.common.exceptions.UserException) LoggerFactory(org.slf4j.LoggerFactory) TrustManager(javax.net.ssl.TrustManager) HttpOAuthConfig(org.apache.drill.exec.store.http.HttpOAuthConfig) StringUtils(org.apache.commons.lang3.StringUtils) FormBody(okhttp3.FormBody) PersistentTokenTable(org.apache.drill.exec.oauth.PersistentTokenTable) Matcher(java.util.regex.Matcher) Proxy(java.net.Proxy) Map(java.util.Map) HostnameVerifier(javax.net.ssl.HostnameVerifier) Interceptor(okhttp3.Interceptor) Request(okhttp3.Request) HttpMethod(org.apache.drill.exec.store.http.HttpApiConfig.HttpMethod) HttpApiConfig(org.apache.drill.exec.store.http.HttpApiConfig) KeyManagementException(java.security.KeyManagementException) Credentials(okhttp3.Credentials) InetSocketAddress(java.net.InetSocketAddress) SSLSocketFactory(javax.net.ssl.SSLSocketFactory) AccessTokenAuthenticator(org.apache.drill.exec.store.http.oauth.AccessTokenAuthenticator) Objects(java.util.Objects) List(java.util.List) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) AccessTokenInterceptor(org.apache.drill.exec.store.http.oauth.AccessTokenInterceptor) Pattern(java.util.regex.Pattern) HttpUrl(okhttp3.HttpUrl) NotNull(org.jetbrains.annotations.NotNull) UnsupportedEncodingException(java.io.UnsupportedEncodingException) Builder(okhttp3.OkHttpClient.Builder) StoragePluginRegistry(org.apache.drill.exec.store.StoragePluginRegistry) CustomErrorContext(org.apache.drill.common.exceptions.CustomErrorContext) ArrayList(java.util.ArrayList) UsernamePasswordCredentials(org.apache.drill.exec.store.security.UsernamePasswordCredentials) AccessTokenRepository(org.apache.drill.exec.store.http.oauth.AccessTokenRepository) Response(okhttp3.Response) Logger(org.slf4j.Logger) IOException(java.io.IOException) CaseInsensitiveMap(org.apache.drill.common.map.CaseInsensitiveMap) Paginator(org.apache.drill.exec.store.http.paginator.Paginator) File(java.io.File) TimeUnit(java.util.concurrent.TimeUnit) OkHttpClient(okhttp3.OkHttpClient) X509TrustManager(javax.net.ssl.X509TrustManager) HttpStoragePluginConfig(org.apache.drill.exec.store.http.HttpStoragePluginConfig) InputStream(java.io.InputStream) AccessTokenInterceptor(org.apache.drill.exec.store.http.oauth.AccessTokenInterceptor) HttpApiConfig(org.apache.drill.exec.store.http.HttpApiConfig) Builder(okhttp3.OkHttpClient.Builder) AccessTokenRepository(org.apache.drill.exec.store.http.oauth.AccessTokenRepository) SSLContext(javax.net.ssl.SSLContext) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) KeyManagementException(java.security.KeyManagementException) UsernamePasswordCredentials(org.apache.drill.exec.store.security.UsernamePasswordCredentials) TrustManager(javax.net.ssl.TrustManager) X509TrustManager(javax.net.ssl.X509TrustManager) HostnameVerifier(javax.net.ssl.HostnameVerifier) HttpOAuthConfig(org.apache.drill.exec.store.http.HttpOAuthConfig) AccessTokenAuthenticator(org.apache.drill.exec.store.http.oauth.AccessTokenAuthenticator) HttpStoragePluginConfig(org.apache.drill.exec.store.http.HttpStoragePluginConfig) SSLSocketFactory(javax.net.ssl.SSLSocketFactory)

Example 2 with HttpApiConfig

use of org.apache.drill.exec.store.http.HttpApiConfig in project drill by apache.

the class SimpleHttp method getInputStream.

/**
 * Returns an InputStream based on the URL and config in the scanSpec. If anything goes wrong
 * the method throws a UserException.
 * @return An Inputstream of the data from the URL call.
 */
public InputStream getInputStream() {
    Request.Builder requestBuilder = new Request.Builder().url(url);
    // The configuration does not allow for any other request types other than POST and GET.
    HttpApiConfig apiConfig = scanDefn.tableSpec().connectionConfig();
    if (apiConfig.getMethodType() == HttpMethod.POST) {
        // Handle POST requests
        FormBody.Builder formBodyBuilder = buildPostBody(apiConfig.postBody());
        requestBuilder.post(formBodyBuilder.build());
    }
    // Log the URL and method to aid in debugging user issues.
    logger.info("Connection: {}, Method {}, URL: {}", scanDefn.tableSpec().connection(), apiConfig.getMethodType().name(), url());
    // Add headers to request
    if (apiConfig.headers() != null) {
        for (Map.Entry<String, String> entry : apiConfig.headers().entrySet()) {
            requestBuilder.addHeader(entry.getKey(), entry.getValue());
        }
    }
    // Build the request object
    Request request = requestBuilder.build();
    try {
        logger.debug("Executing request: {}", request);
        logger.debug("Headers: {}", request.headers());
        // Execute the request
        Response response = client.newCall(request).execute();
        // Preserve the response
        responseMessage = response.message();
        responseCode = response.code();
        responseProtocol = response.protocol().toString();
        responseURL = response.request().url().toString();
        // Case for pagination without limit
        if (paginator != null && (response.code() != 200 || response.body() == null || response.body().contentLength() == 0)) {
            paginator.notifyPartialPage();
        }
        // If the request is unsuccessful, throw a UserException
        if (!isSuccessful(responseCode)) {
            throw UserException.dataReadError().message("HTTP request failed").addContext("Response code", response.code()).addContext("Response message", response.message()).addContext(errorContext).build(logger);
        }
        logger.debug("HTTP Request for {} successful.", url());
        logger.debug("Response Headers: {} ", response.headers());
        // Return the InputStream of the response
        return Objects.requireNonNull(response.body()).byteStream();
    } catch (IOException e) {
        throw UserException.dataReadError(e).message("Failed to read the HTTP response body").addContext("Error message", e.getMessage()).addContext(errorContext).build(logger);
    }
}
Also used : Response(okhttp3.Response) HttpApiConfig(org.apache.drill.exec.store.http.HttpApiConfig) Request(okhttp3.Request) FormBody(okhttp3.FormBody) IOException(java.io.IOException) Map(java.util.Map) CaseInsensitiveMap(org.apache.drill.common.map.CaseInsensitiveMap)

Aggregations

IOException (java.io.IOException)2 Map (java.util.Map)2 FormBody (okhttp3.FormBody)2 Request (okhttp3.Request)2 Response (okhttp3.Response)2 CaseInsensitiveMap (org.apache.drill.common.map.CaseInsensitiveMap)2 HttpApiConfig (org.apache.drill.exec.store.http.HttpApiConfig)2 File (java.io.File)1 InputStream (java.io.InputStream)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 InetSocketAddress (java.net.InetSocketAddress)1 Proxy (java.net.Proxy)1 URLDecoder (java.net.URLDecoder)1 KeyManagementException (java.security.KeyManagementException)1 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)1 X509Certificate (java.security.cert.X509Certificate)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Objects (java.util.Objects)1 TimeUnit (java.util.concurrent.TimeUnit)1