From 18616eae52e94deec16b9e24324fc8a4c65f026d Mon Sep 17 00:00:00 2001 From: Jordan Doyle Date: Thu, 22 Mar 2018 01:37:40 +0000 Subject: [PATCH] Replace HttpURLConnection with Apache HttpClient --- pom.xml | 5 + .../dns/resolve/HttpResolver.java | 110 +++++++++--------- 2 files changed, 60 insertions(+), 55 deletions(-) diff --git a/pom.xml b/pom.xml index f72a60f..e4312d8 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,11 @@ java-pinning-java7 1.1.0 + + org.apache.httpcomponents + httpclient + 4.5.5 + ${project.artifactId} diff --git a/src/main/java/com/moparisthebest/dns/resolve/HttpResolver.java b/src/main/java/com/moparisthebest/dns/resolve/HttpResolver.java index 15b0a30..c92ef80 100644 --- a/src/main/java/com/moparisthebest/dns/resolve/HttpResolver.java +++ b/src/main/java/com/moparisthebest/dns/resolve/HttpResolver.java @@ -1,79 +1,79 @@ package com.moparisthebest.dns.resolve; import com.moparisthebest.dns.dto.Packet; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; -import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSocketFactory; -import java.io.*; import java.net.*; +import java.util.concurrent.TimeUnit; -import static com.moparisthebest.dns.Util.readPacket; public class HttpResolver extends AbstractQueueProcessingResolver { - private final OpenConnection openConnection; - private final int connectTimeout; - private final int readTimeout = 4000; - - interface OpenConnection { - HttpURLConnection open() throws Exception; - } + private final HttpClient client; + private final HttpPost request; public HttpResolver(final int maxRetries, final String name, final URL url, final int connectTimeout, final Proxy proxy, final SSLSocketFactory sslSocketFactory) { super(maxRetries, name); - this.connectTimeout = connectTimeout; - if(proxy == null && sslSocketFactory == null) { - openConnection = () -> (HttpURLConnection) url.openConnection(); - } else if(proxy != null && sslSocketFactory == null) { - openConnection = () -> (HttpURLConnection) url.openConnection(proxy); - } else if(proxy == null - //&& sslSocketFactory != null - ) { - openConnection = () -> { - final HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); - conn.setSSLSocketFactory(sslSocketFactory); - return conn; - }; - } else //if(proxy != null && sslSocketFactory != null) - { - openConnection = () -> { - final HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(proxy); - conn.setSSLSocketFactory(sslSocketFactory); - return conn; - }; + + HttpHost proxyHost; + + if (proxy != null && proxy.type().equals(Proxy.Type.HTTP)) { + final InetSocketAddress socketAddress = (InetSocketAddress) proxy.address(); + final InetAddress inetAddress = socketAddress.getAddress(); + + proxyHost = new HttpHost(inetAddress, socketAddress.getPort()); + } else if (proxy != null && proxy.type().equals(Proxy.Type.SOCKS)) { + throw new IllegalArgumentException("Socks hosts aren't supported"); + } else { + proxyHost = null; + } + + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(connectTimeout) + .setConnectTimeout(connectTimeout) + .setSocketTimeout(connectTimeout) + .build(); + + this.client = HttpClients.custom() + // .setSSLSocketFactory(new SSLConnectionSocketFactory(sslSocketFactory, (s, sslSession) -> s.equalsIgnoreCase(name))) + .setProxy(proxyHost) + .setConnectionTimeToLive(365, TimeUnit.DAYS) + .setDefaultRequestConfig(requestConfig) + .build(); + + try { + this.request = new HttpPost(url.toURI()); + this.request.setHeader(HttpHeaders.CONTENT_TYPE, "application/dns-udpwireformat"); + this.request.setHeader(HttpHeaders.ACCEPT, "application/dns-udpwireformat"); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Failed to parse upstream DNS URL", e); } } @Override public Packet resolve(final Packet request) throws Exception { - final HttpURLConnection conn = openConnection.open(); + final HttpPost req = (HttpPost) this.request.clone(); + req.setEntity(new ByteArrayEntity(request.getBuf().array())); - conn.setConnectTimeout(connectTimeout); - conn.setReadTimeout(readTimeout); - conn.setUseCaches(false); - conn.setDoInput(true); - conn.setDoOutput(true); + final HttpResponse response = this.client.execute(req); - conn.setRequestMethod("POST"); - conn.setRequestProperty("Content-Type", "application/dns-udpwireformat"); - conn.setRequestProperty("Accept", "application/dns-udpwireformat"); + final int responseCode = response.getStatusLine().getStatusCode(); + // System.out.println("responseCode: " + responseCode); - //conn.connect(); + final HttpEntity responseEntity = response.getEntity(); - try (OutputStream os = conn.getOutputStream()) { + final long contentLength = responseEntity.getContentLength(); + // System.out.println("contentLength: " + contentLength); - os.write(request.getBuf().array()); - os.flush(); - - try (InputStream is = conn.getInputStream(); - DataInputStream dis = new DataInputStream(is);) { - final int responseCode = conn.getResponseCode(); - //System.out.println("responseCode: " + responseCode); - - final int contentLength = conn.getContentLength(); - //System.out.println("contentLength: " + contentLength); - - return readPacket(contentLength, dis); - } - } + return new Packet(EntityUtils.toByteArray(responseEntity)); } }