This commit is contained in:
Jordan Doyle 2018-06-17 05:27:28 +00:00 committed by GitHub
commit c53f9f2254
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 55 deletions

View File

@ -50,6 +50,11 @@
<artifactId>java-pinning-java7</artifactId> <artifactId>java-pinning-java7</artifactId>
<version>1.1.0</version> <version>1.1.0</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
<finalName>${project.artifactId}</finalName> <finalName>${project.artifactId}</finalName>

View File

@ -1,79 +1,79 @@
package com.moparisthebest.dns.resolve; package com.moparisthebest.dns.resolve;
import com.moparisthebest.dns.dto.Packet; 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 javax.net.ssl.SSLSocketFactory;
import java.io.*;
import java.net.*; import java.net.*;
import java.util.concurrent.TimeUnit;
import static com.moparisthebest.dns.Util.readPacket;
public class HttpResolver extends AbstractQueueProcessingResolver { public class HttpResolver extends AbstractQueueProcessingResolver {
private final OpenConnection openConnection; private final HttpClient client;
private final int connectTimeout; private final HttpPost request;
private final int readTimeout = 4000;
interface OpenConnection {
HttpURLConnection open() throws Exception;
}
public HttpResolver(final int maxRetries, final String name, final URL url, final int connectTimeout, final Proxy proxy, final SSLSocketFactory sslSocketFactory) { public HttpResolver(final int maxRetries, final String name, final URL url, final int connectTimeout, final Proxy proxy, final SSLSocketFactory sslSocketFactory) {
super(maxRetries, name); super(maxRetries, name);
this.connectTimeout = connectTimeout;
if(proxy == null && sslSocketFactory == null) { HttpHost proxyHost;
openConnection = () -> (HttpURLConnection) url.openConnection();
} else if(proxy != null && sslSocketFactory == null) { if (proxy != null && proxy.type().equals(Proxy.Type.HTTP)) {
openConnection = () -> (HttpURLConnection) url.openConnection(proxy); final InetSocketAddress socketAddress = (InetSocketAddress) proxy.address();
} else if(proxy == null final InetAddress inetAddress = socketAddress.getAddress();
//&& sslSocketFactory != null
) { proxyHost = new HttpHost(inetAddress, socketAddress.getPort());
openConnection = () -> { } else if (proxy != null && proxy.type().equals(Proxy.Type.SOCKS)) {
final HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); throw new IllegalArgumentException("Socks hosts aren't supported");
conn.setSSLSocketFactory(sslSocketFactory); } else {
return conn; proxyHost = null;
}; }
} else //if(proxy != null && sslSocketFactory != null)
{ RequestConfig requestConfig = RequestConfig.custom()
openConnection = () -> { .setConnectionRequestTimeout(connectTimeout)
final HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(proxy); .setConnectTimeout(connectTimeout)
conn.setSSLSocketFactory(sslSocketFactory); .setSocketTimeout(connectTimeout)
return conn; .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 @Override
public Packet resolve(final Packet request) throws Exception { 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); final HttpResponse response = this.client.execute(req);
conn.setReadTimeout(readTimeout);
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST"); final int responseCode = response.getStatusLine().getStatusCode();
conn.setRequestProperty("Content-Type", "application/dns-udpwireformat"); // System.out.println("responseCode: " + responseCode);
conn.setRequestProperty("Accept", "application/dns-udpwireformat");
//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()); return new Packet(EntityUtils.toByteArray(responseEntity));
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);
}
}
} }
} }