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

org.shredzone.acme4j.connector.HttpConnector Maven / Gradle / Ivy

There is a newer version: 3.4.0
Show newest version
/*
 * acme4j - Java ACME client
 *
 * Copyright (C) 2015 Richard "Shred" Körber
 *   http://acme4j.shredzone.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
package org.shredzone.acme4j.connector;

import java.net.URISyntaxException;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.util.Properties;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.slf4j.LoggerFactory;

/**
 * A generic HTTP connector. It creates {@link HttpClient.Builder} and
 * {@link HttpRequest.Builder} that can be individually customized according to the needs
 * of the CA.
 *
 * @since 3.0.0
 */
public class HttpConnector {
    private static final String USER_AGENT;

    private final NetworkSettings networkSettings;

    static {
        var agent = new StringBuilder("acme4j");

        try (var in = HttpConnector.class.getResourceAsStream("/org/shredzone/acme4j/version.properties")) {
            var prop = new Properties();
            prop.load(in);
            agent.append('/').append(prop.getProperty("version"));
        } catch (Exception ex) {
            // Ignore, just don't use a version
            LoggerFactory.getLogger(HttpConnector.class).warn("Could not read library version", ex);
        }

        agent.append(" Java/").append(System.getProperty("java.version"));
        USER_AGENT = agent.toString();
    }

    /**
     * Returns the default User-Agent to be used.
     *
     * @return User-Agent
     */
    public static String defaultUserAgent() {
        return USER_AGENT;
    }

    /**
     * Creates a new {@link HttpConnector} that is using the given
     * {@link NetworkSettings}.
     */
    @SuppressFBWarnings("EI_EXPOSE_REP2")   // behavior is intended
    public HttpConnector(NetworkSettings networkSettings) {
        this.networkSettings = networkSettings;
    }

    /**
     * Creates a new {@link HttpRequest.Builder} that is preconfigured and bound to the
     * given URL. Subclasses can override this method to extend the configuration, or
     * create a different builder.
     *
     * @param url
     *            {@link URL} to connect to
     * @return {@link HttpRequest.Builder} connected to the {@link URL}
     */
    public HttpRequest.Builder createRequestBuilder(URL url) {
        try {
            return HttpRequest.newBuilder(url.toURI())
                    .header("User-Agent", USER_AGENT)
                    .timeout(networkSettings.getTimeout());
        } catch (URISyntaxException ex) {
            throw new IllegalArgumentException("Invalid URL", ex);
        }
    }

    /**
     * Creates a new {@link HttpClient.Builder}.
     * 

* The {@link HttpClient.Builder} is already preconfigured with a reasonable timeout, * the proxy settings, authenticator, and that it follows normal redirects. * Subclasses can override this method to extend the configuration, or to create a * different builder. */ public HttpClient.Builder createClientBuilder() { var builder = HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.NORMAL) .connectTimeout(networkSettings.getTimeout()) .proxy(networkSettings.getProxySelector()); if (networkSettings.getAuthenticator() != null) { builder.authenticator(networkSettings.getAuthenticator()); } return builder; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy