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

net.dongliu.cute.http.ClientBuilder Maven / Gradle / Ivy

The newest version!
package net.dongliu.cute.http;

import net.dongliu.cute.http.internal.Asserts;
import net.dongliu.cute.http.internal.HonoredCookieManager;
import net.dongliu.cute.http.json.JsonMarshaller;
import org.checkerframework.checker.nullness.qual.Nullable;

import java.net.Authenticator;
import java.net.CookieHandler;
import java.net.Proxy;
import java.net.ProxySelector;
import java.security.KeyStore;
import java.time.Duration;
import java.util.concurrent.Executor;

import static java.util.Objects.requireNonNull;

/**
 * Builder to build Http Client.
 */
public class ClientBuilder {
    @Nullable String name;
    @Nullable ProxySelector proxySelector = null;
    boolean useHttp2 = true;
    boolean verifyCert = true;
    boolean followRedirect = true;
    @Nullable Authenticator authenticator = null;
    CookieHandler cookieHandler = new HonoredCookieManager();
    @Nullable Executor executor = null;
    @Nullable KeyStore keyStore = null;
    // connect timeout, include ssl handshake etc.
    Duration connectTimeout = Duration.ofSeconds(5);

    // The response timeout. this filed can be override by per request setting
    Duration timeout = Duration.ofSeconds(10);
    @Nullable String userAgent = null;
    boolean acceptCompressed = true;

    @Nullable JsonMarshaller jsonMarshaller;

    /**
     * Build a new http Client.
     *
     * @return the http client
     */
    public Client build() {
        return new Client(this);
    }

    /**
     * Set name for this http client
     */
    public ClientBuilder name(String name) {
        this.name = requireNonNull(name);
        return this;
    }

    /**
     * Set a proxy selector for this client. If not set, will use no proxy.
     * Note: seems JDK HttpClient Only support http proxy.
     */
    public ClientBuilder proxy(ProxySelector proxySelector) {
        this.proxySelector = requireNonNull(proxySelector);
        return this;
    }

    /**
     * Set a proxy for this client. If not set, will use no proxy.
     * Note: seems JDK HttpClient Only support http proxy.
     */
    public ClientBuilder proxy(Proxy proxy) {
        requireNonNull(proxy);
        this.proxySelector = requireNonNull(ProxySelectors.staticSelector(proxy));
        return this;
    }

    /**
     * If use http2. default true
     */
    public ClientBuilder useHttp2(boolean useHttp2) {
        this.useHttp2 = useHttp2;
        return this;
    }

    /**
     * If check https certificate, default true.
     */
    public ClientBuilder verifyCert(boolean verify) {
        this.verifyCert = verify;
        return this;
    }

    /**
     * If follow redirects. Default true
     */
    public ClientBuilder followRedirect(boolean followRedirect) {
        this.followRedirect = followRedirect;
        return this;
    }

    /**
     * Set timeout for connecting phase. The timeout include ssl handshake, etc. Default is 5 secs.
     */
    public ClientBuilder connectTimeout(Duration timeout) {
        this.connectTimeout = Asserts.checkTimeout(timeout);
        return this;
    }

    /**
     * The timeout for one request to return response, do not include connect time. Default is 10 secs.
     * Note: The can be override by request setting.
     */
    public ClientBuilder timeout(Duration timeout) {
        this.timeout = Asserts.checkTimeout(timeout);
        return this;
    }

    /**
     * The client user-agent.
     * Note: The can be override by request setting.
     */
    public ClientBuilder userAgent(String userAgent) {
        this.userAgent = requireNonNull(userAgent);
        return this;
    }

    /**
     * Auto set Accept-Encoding header for request. Default is true.
     * Note: This setting can be override by per request setting.
     */
    public ClientBuilder acceptCompressed(boolean acceptCompressed) {
        this.acceptCompressed = acceptCompressed;
        return this;
    }

    /**
     * Provide Authenticator for http basic or digest Authentication. If not set, will use system default Authenticator.
     *
     * @param authenticator the authenticator
     * @return self
     */
    public ClientBuilder authenticator(Authenticator authenticator) {
        this.authenticator = requireNonNull(authenticator);
        return this;
    }

    /**
     * Provide CookieHandler for handle cookies.If not set, will use default in-memory store CookieManager.
     *
     * @param cookieHandler the cookieManager
     * @return self
     */
    public ClientBuilder cookieHandler(CookieHandler cookieHandler) {
        this.cookieHandler = requireNonNull(cookieHandler);
        return this;
    }

    /**
     * Provide KeyStore for create ssl connection, trust the server certificate.
     *
     * @param keyStore the keyStore
     * @return self
     */
    public ClientBuilder keyStore(KeyStore keyStore) {
        this.keyStore = requireNonNull(keyStore);
        return this;
    }

    /**
     * Set a custom executor, for asynchronous and dependent tasks.
     *
     * @param executor the executor
     * @return self
     */
    public ClientBuilder executor(Executor executor) {
        this.executor = requireNonNull(executor);
        return this;
    }

    /**
     * Set json marshaller for this http client.
     * If not set, will try to find available JsonMarshaller implementation by spi; If no spi implementation was found,
     * a {@link net.dongliu.cute.http.exception.JsonMarshallerNotFoundException} would be thrown when handle with json.
     *
     * @param jsonMarshaller the JsonMarshaller
     */
    public ClientBuilder jsonMarshaller(JsonMarshaller jsonMarshaller) {
        this.jsonMarshaller = requireNonNull(jsonMarshaller);
        return this;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy