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

com.signalfx.shaded.jetty.client.ProxyConfiguration Maven / Gradle / Ivy

The newest version!
//
//  ========================================================================
//  Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package com.signalfx.shaded.jetty.client;

import java.net.URI;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import com.signalfx.shaded.jetty.io.ClientConnectionFactory;
import com.signalfx.shaded.jetty.util.HostPort;
import com.signalfx.shaded.jetty.util.ssl.SslContextFactory;

/**
 * The configuration of the forward proxy to use with {@link com.signalfx.shaded.jetty.client.HttpClient}.
 * 

* Applications add subclasses of {@link Proxy} to this configuration via: *

 * ProxyConfiguration proxyConfig = httpClient.getProxyConfiguration();
 * proxyConfig.getProxies().add(new HttpProxy(proxyHost, 8080));
 * 
* * @see HttpClient#getProxyConfiguration() */ public class ProxyConfiguration { private final List proxies = new ArrayList<>(); public List getProxies() { return proxies; } public Proxy match(Origin origin) { for (Proxy proxy : getProxies()) { if (proxy.matches(origin)) return proxy; } return null; } public abstract static class Proxy { // TODO use InetAddressSet? Or IncludeExcludeSet? private final Set included = new HashSet<>(); private final Set excluded = new HashSet<>(); private final Origin.Address address; private final boolean secure; private final SslContextFactory.Client sslContextFactory; protected Proxy(Origin.Address address, boolean secure) { this(address, secure, null); } protected Proxy(Origin.Address address, SslContextFactory.Client sslContextFactory) { this(address, true, Objects.requireNonNull(sslContextFactory)); } private Proxy(Origin.Address address, boolean secure, SslContextFactory.Client sslContextFactory) { this.address = address; this.secure = secure; this.sslContextFactory = sslContextFactory; } /** * @return the address of this proxy */ public Origin.Address getAddress() { return address; } /** * @return whether the connection to the proxy must be secured via TLS */ public boolean isSecure() { return secure; } /** * @return the optional SslContextFactory to use when connecting to proxies */ public SslContextFactory.Client getSslContextFactory() { return sslContextFactory; } /** * @return the list of origins that must be proxied * @see #matches(Origin) * @see #getExcludedAddresses() */ public Set getIncludedAddresses() { return included; } /** * @return the list of origins that must not be proxied. * @see #matches(Origin) * @see #getIncludedAddresses() */ public Set getExcludedAddresses() { return excluded; } /** * @return an URI representing this proxy, or null if no URI can represent this proxy */ public URI getURI() { return null; } /** * Matches the given {@code origin} with the included and excluded addresses, * returning true if the given {@code origin} is to be proxied. * * @param origin the origin to test for proxying * @return true if the origin must be proxied, false otherwise */ public boolean matches(Origin origin) { if (getAddress().equals(origin.getAddress())) return false; boolean result = included.isEmpty(); Origin.Address address = origin.getAddress(); for (String included : this.included) { if (matches(address, included)) { result = true; break; } } for (String excluded : this.excluded) { if (matches(address, excluded)) { result = false; break; } } return result; } private boolean matches(Origin.Address address, String pattern) { // TODO: add support for CIDR notation like 192.168.0.0/24, see DoSFilter HostPort hostPort = new HostPort(pattern); String host = hostPort.getHost(); int port = hostPort.getPort(); return host.equals(address.getHost()) && (port <= 0 || port == address.getPort()); } /** * @param connectionFactory the nested {@link ClientConnectionFactory} * @return a new {@link ClientConnectionFactory} for this {@link Proxy} */ public abstract ClientConnectionFactory newClientConnectionFactory(ClientConnectionFactory connectionFactory); @Override public String toString() { return address.toString(); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy