Merge 18616eae52
into 916c97d66b
This commit is contained in:
commit
c53f9f2254
5
pom.xml
5
pom.xml
|
@ -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>
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue