Last active
October 17, 2021 12:57
-
-
Save ResolveWang/e606057fd39f5178cfcbe91e342b89f7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.apache.http.HttpHost; | |
import org.apache.http.client.methods.CloseableHttpResponse; | |
import org.apache.http.client.methods.HttpGet; | |
import org.apache.http.client.protocol.HttpClientContext; | |
import org.apache.http.config.Registry; | |
import org.apache.http.config.RegistryBuilder; | |
import org.apache.http.conn.DnsResolver; | |
import org.apache.http.conn.socket.ConnectionSocketFactory; | |
import org.apache.http.conn.socket.PlainConnectionSocketFactory; | |
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |
import org.apache.http.ssl.SSLContexts; | |
import org.apache.http.impl.client.CloseableHttpClient; | |
import org.apache.http.impl.client.HttpClients; | |
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | |
import org.apache.http.protocol.HttpContext; | |
import org.apache.http.util.EntityUtils; | |
import javax.net.ssl.SSLContext; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.net.*; | |
// from stackoverflow | |
// if you use python, requests can do it by using args of proxies | |
public class Test { | |
public static void main(String[] args) throws Exception { | |
Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create() | |
.register("http", new MyConnectionSocketFactory()) | |
.register("https", new MySSLConnectionSocketFactory(SSLContexts.createSystemDefault())).build(); | |
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg, new FakeDnsResolver()); | |
CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(cm).build(); | |
try { | |
InetSocketAddress socksaddr = new InetSocketAddress("127.0.0.1", 1080); | |
HttpClientContext context = HttpClientContext.create(); | |
context.setAttribute("socks.address", socksaddr); | |
HttpGet request = new HttpGet("https://www.google.com"); | |
System.out.println("Executing request " + request + " via SOCKS proxy " + socksaddr); | |
CloseableHttpResponse response = httpclient.execute(request, context); | |
try { | |
System.out.println("----------------------------------------"); | |
System.out.println(response.getStatusLine()); | |
int i = -1; | |
InputStream stream = response.getEntity().getContent(); | |
while ((i = stream.read()) != -1) { | |
System.out.print((char) i); | |
} | |
EntityUtils.consume(response.getEntity()); | |
} finally { | |
response.close(); | |
} | |
} finally { | |
httpclient.close(); | |
} | |
} | |
static class FakeDnsResolver implements DnsResolver { | |
@Override | |
public InetAddress[] resolve(String host) throws UnknownHostException { | |
// Return some fake DNS record for every request, we won't be using it | |
return new InetAddress[]{InetAddress.getByAddress(new byte[]{1, 1, 1, 1})}; | |
} | |
} | |
static class MyConnectionSocketFactory extends PlainConnectionSocketFactory { | |
@Override | |
public Socket createSocket(final HttpContext context) throws IOException { | |
InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address"); | |
Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); | |
return new Socket(proxy); | |
} | |
@Override | |
public Socket connectSocket(int connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, | |
InetSocketAddress localAddress, HttpContext context) throws IOException { | |
// Convert address to unresolved | |
InetSocketAddress unresolvedRemote = InetSocketAddress | |
.createUnresolved(host.getHostName(), remoteAddress.getPort()); | |
return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context); | |
} | |
} | |
static class MySSLConnectionSocketFactory extends SSLConnectionSocketFactory { | |
public MySSLConnectionSocketFactory(final SSLContext sslContext) { | |
// You may need this verifier if target site's certificate is not secure | |
super(sslContext, ALLOW_ALL_HOSTNAME_VERIFIER); | |
} | |
@Override | |
public Socket createSocket(final HttpContext context) throws IOException { | |
InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address"); | |
Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); | |
return new Socket(proxy); | |
} | |
@Override | |
public Socket connectSocket(int connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, | |
InetSocketAddress localAddress, HttpContext context) throws IOException { | |
InetSocketAddress unresolvedRemote = InetSocketAddress | |
.createUnresolved(host.getHostName(), remoteAddress.getPort()); | |
return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context); | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment