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

org.codehaus.httpcache4j.resolver.ning.NingResponseResolver Maven / Gradle / Ivy

There is a newer version: 5.1.1
Show newest version
package org.codehaus.httpcache4j.resolver.ning;

import io.netty.handler.codec.http.HttpHeaders;
import org.asynchttpclient.*;
import org.asynchttpclient.request.body.generator.InputStreamBodyGenerator;
import org.codehaus.httpcache4j.*;
import org.codehaus.httpcache4j.auth.Authenticator;
import org.codehaus.httpcache4j.auth.ProxyAuthenticator;
import org.codehaus.httpcache4j.resolver.AbstractResponseResolver;
import org.codehaus.httpcache4j.resolver.ConnectionConfiguration;
import org.codehaus.httpcache4j.resolver.ResolverConfiguration;
import org.codehaus.httpcache4j.resolver.ResponseCreator;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static org.codehaus.httpcache4j.HTTPMethod.*;

/**
 * @author Erlend Hamnaberg
 * @version $Revision: $
 */
public class NingResponseResolver extends AbstractResponseResolver {
    private final AsyncHttpClient client;

    protected NingResponseResolver(ResolverConfiguration configuration, DefaultAsyncHttpClientConfig.Builder builder, Consumer configF) {
        super(configuration);
        builder.setUserAgent(configuration.getUserAgent());
        builder.setFollowRedirect(false);
        ConnectionConfiguration connectionConfiguration = configureConnections(configuration, builder);
        configF.accept(builder);
        if (!connectionConfiguration.getConnectionsPerHost().isEmpty()) {
            throw new UnsupportedOperationException("This Resolver does not support connections per host");
        }
        client = new DefaultAsyncHttpClient(builder.build());
    }

    private ConnectionConfiguration configureConnections(ResolverConfiguration configuration, DefaultAsyncHttpClientConfig.Builder config) {
        ConnectionConfiguration connectionConfiguration = configuration.getConnectionConfiguration();
        if (connectionConfiguration.getMaxConnections().isPresent()) {
            config.setMaxConnections(connectionConfiguration.getMaxConnections().get());
        }
        if (connectionConfiguration.getDefaultConnectionsPerHost().isPresent()) {
            config.setMaxConnectionsPerHost(connectionConfiguration.getDefaultConnectionsPerHost().get());
        }
        if (connectionConfiguration.getTimeout().isPresent()) {
            config.setReadTimeout(connectionConfiguration.getTimeout().get());
        }
        if (connectionConfiguration.getSocketTimeout().isPresent()) {
            config.setConnectTimeout(connectionConfiguration.getSocketTimeout().get());
        }
        return connectionConfiguration;
    }

    public NingResponseResolver(ResolverConfiguration configuration) {
        this(configuration, new DefaultAsyncHttpClientConfig.Builder(), config -> {});
    }

    public NingResponseResolver(ResolverConfiguration configuration, Consumer configF) {
        this(configuration, new DefaultAsyncHttpClientConfig.Builder(), configF);
    }

    public NingResponseResolver(ProxyAuthenticator proxyAuthenticator, Authenticator authenticator) {
        this(new ResolverConfiguration(proxyAuthenticator, authenticator, new ConnectionConfiguration()));
    }

    public static NingResponseResolver newInstance(ResolverConfiguration configuration) {
        return new NingResponseResolver(configuration);
    }

    public static NingResponseResolver newInstance(ConnectionConfiguration configuration) {
        return newInstance(new ResolverConfiguration().withConnectionConfiguration(configuration));
    }

    public static NingResponseResolver newInstance() {
        return newInstance(new ConnectionConfiguration());
    }

    @Override
    protected HTTPResponse resolveImpl(HTTPRequest request) throws IOException {
        Future responseFuture = execute(request);
        return translate(responseFuture);
    }

    public void shutdown() {
        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private HTTPResponse translate(Future responseFuture) throws IOException {
        try {
            Response response = responseFuture.get();
            StatusLine line = new StatusLine(Status.valueOf(response.getStatusCode()), response.getStatusText());
            HttpHeaders headers = response.getHeaders();
            Optional stream = Optional.ofNullable(response.getResponseBodyAsStream());
            List
headerList = StreamSupport.stream(headers.spliterator(), false).map(e -> new Header(e.getKey(), e.getValue())).collect(Collectors.toList()); return ResponseCreator.createResponse(line, new Headers(headerList), stream); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (ExecutionException e) { throw new HTTPException(e.getCause()); } throw new HTTPException("Not possible to get response"); } private Future execute(final HTTPRequest request) throws IOException { BoundRequestBuilder builder = builder(request.getNormalizedURI(), request.getMethod()); if (request.getMethod().canHavePayload()) { request.getPayload().ifPresent(p -> { if (getConfiguration().isUseChunked()) { builder.setBody(new InputStreamBodyGenerator(p.getInputStream())); } else { builder.setBody(p.getInputStream()); } }); } for (Header header : request.getAllHeaders()) { builder.addHeader(header.getName(), header.getValue()); } return builder.execute(); } private BoundRequestBuilder builder(URI uri, HTTPMethod method) { if (DELETE.equals(method)) { return client.prepareDelete(uri.toString()); } else if (GET.equals(method)) { return client.prepareGet(uri.toString()); } else if (HEAD.equals(method)) { return client.prepareHead(uri.toString()); } else if (OPTIONS.equals(method)) { return client.prepareOptions(uri.toString()); } else if (POST.equals(method)) { return client.preparePost(uri.toString()); } else if (PUT.equals(method)) { return client.preparePut(uri.toString()); } throw new IllegalArgumentException("Unable to create request for method " + method); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy