blob: b0145277e861cf64222349a92b4ff258de5e5a13 [file] [log] [blame]
/*
* Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch> and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.transport.sshd;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.SocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
/**
* A default implementation of a {@link ProxyDataFactory} based on the standard
* {@link java.net.ProxySelector}.
*
* @since 5.2
*/
public class DefaultProxyDataFactory implements ProxyDataFactory {
@Override
public ProxyData get(InetSocketAddress remoteAddress) {
try {
List<Proxy> proxies = ProxySelector.getDefault()
.select(new URI(
"socket://" + remoteAddress.getHostString())); //$NON-NLS-1$
ProxyData data = getData(proxies, Proxy.Type.SOCKS);
if (data == null) {
proxies = ProxySelector.getDefault()
.select(new URI(Proxy.Type.HTTP.name(),
"//" + remoteAddress.getHostString(), //$NON-NLS-1$
null));
data = getData(proxies, Proxy.Type.HTTP);
}
return data;
} catch (URISyntaxException e) {
return null;
}
}
private ProxyData getData(List<Proxy> proxies, Proxy.Type type) {
Proxy proxy = proxies.stream().filter(p -> type == p.type()).findFirst()
.orElse(null);
if (proxy == null) {
return null;
}
SocketAddress address = proxy.address();
if (!(address instanceof InetSocketAddress)) {
return null;
}
switch (type) {
case HTTP:
return new ProxyData(proxy);
case SOCKS:
return new ProxyData(proxy);
default:
return null;
}
}
}