added proxy feature
So now, it's support http, socks4 and socks5 proxys
This commit is contained in:
parent
95dd4e3a3f
commit
346a9dc045
@ -33,6 +33,7 @@ import org.telegram.telegrambots.updateshandlers.SentCallback;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@ -56,7 +57,7 @@ public abstract class DefaultAbsSender extends AbsSender {
|
|||||||
protected final ExecutorService exe;
|
protected final ExecutorService exe;
|
||||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||||
private final DefaultBotOptions options;
|
private final DefaultBotOptions options;
|
||||||
private volatile CloseableHttpClient httpclient;
|
private volatile CloseableHttpClient httpClient;
|
||||||
private volatile RequestConfig requestConfig;
|
private volatile RequestConfig requestConfig;
|
||||||
|
|
||||||
protected DefaultAbsSender(DefaultBotOptions options) {
|
protected DefaultAbsSender(DefaultBotOptions options) {
|
||||||
@ -64,10 +65,10 @@ public abstract class DefaultAbsSender extends AbsSender {
|
|||||||
this.exe = Executors.newFixedThreadPool(options.getMaxThreads());
|
this.exe = Executors.newFixedThreadPool(options.getMaxThreads());
|
||||||
this.options = options;
|
this.options = options;
|
||||||
|
|
||||||
httpclient = TelegramHttpClientBuilder.build(options);
|
httpClient = TelegramHttpClientBuilder.build(options);
|
||||||
|
configureHttpContext();
|
||||||
|
|
||||||
requestConfig = options.getRequestConfig();
|
requestConfig = options.getRequestConfig();
|
||||||
|
|
||||||
if (requestConfig == null) {
|
if (requestConfig == null) {
|
||||||
requestConfig = RequestConfig.copy(RequestConfig.custom().build())
|
requestConfig = RequestConfig.copy(RequestConfig.custom().build())
|
||||||
.setSocketTimeout(SOCKET_TIMEOUT)
|
.setSocketTimeout(SOCKET_TIMEOUT)
|
||||||
@ -76,6 +77,22 @@ public abstract class DefaultAbsSender extends AbsSender {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void configureHttpContext() {
|
||||||
|
|
||||||
|
if (options.getProxyType() != DefaultBotOptions.ProxyType.NO_PROXY) {
|
||||||
|
InetSocketAddress socksaddr = new InetSocketAddress(options.getProxyHost(), options.getProxyPort());
|
||||||
|
options.getHttpContext().setAttribute("socketAddress", socksaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.getProxyType() == DefaultBotOptions.ProxyType.SOCKS4) {
|
||||||
|
options.getHttpContext().setAttribute("socksVersion", 4);
|
||||||
|
}
|
||||||
|
if (options.getProxyType() == DefaultBotOptions.ProxyType.SOCKS5) {
|
||||||
|
options.getHttpContext().setAttribute("socksVersion", 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the token of the bot to be able to perform Telegram Api Requests
|
* Returns the token of the bot to be able to perform Telegram Api Requests
|
||||||
* @return Token of the bot
|
* @return Token of the bot
|
||||||
@ -734,7 +751,7 @@ public abstract class DefaultAbsSender extends AbsSender {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String sendHttpPostRequest(HttpPost httppost) throws IOException {
|
private String sendHttpPostRequest(HttpPost httppost) throws IOException {
|
||||||
try (CloseableHttpResponse response = httpclient.execute(httppost)) {
|
try (CloseableHttpResponse response = httpClient.execute(httppost, options.getHttpContext())) {
|
||||||
HttpEntity ht = response.getEntity();
|
HttpEntity ht = response.getEntity();
|
||||||
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
|
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
|
||||||
return EntityUtils.toString(buf, StandardCharsets.UTF_8);
|
return EntityUtils.toString(buf, StandardCharsets.UTF_8);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package org.telegram.telegrambots.bots;
|
package org.telegram.telegrambots.bots;
|
||||||
|
|
||||||
import org.apache.http.HttpHost;
|
|
||||||
import org.apache.http.client.CredentialsProvider;
|
|
||||||
import org.apache.http.client.config.RequestConfig;
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.protocol.HttpClientContext;
|
||||||
|
import org.apache.http.protocol.HttpContext;
|
||||||
import org.telegram.telegrambots.ApiConstants;
|
import org.telegram.telegrambots.ApiConstants;
|
||||||
import org.telegram.telegrambots.generics.BotOptions;
|
import org.telegram.telegrambots.generics.BotOptions;
|
||||||
import org.telegram.telegrambots.updatesreceivers.ExponentialBackOff;
|
import org.telegram.telegrambots.updatesreceivers.ExponentialBackOff;
|
||||||
@ -18,14 +18,27 @@ import java.util.List;
|
|||||||
public class DefaultBotOptions implements BotOptions {
|
public class DefaultBotOptions implements BotOptions {
|
||||||
private int maxThreads; ///< Max number of threads used for async methods executions (default 1)
|
private int maxThreads; ///< Max number of threads used for async methods executions (default 1)
|
||||||
private RequestConfig requestConfig;
|
private RequestConfig requestConfig;
|
||||||
|
private volatile HttpContext httpContext;
|
||||||
private ExponentialBackOff exponentialBackOff;
|
private ExponentialBackOff exponentialBackOff;
|
||||||
private Integer maxWebhookConnections;
|
private Integer maxWebhookConnections;
|
||||||
private String baseUrl;
|
private String baseUrl;
|
||||||
private List<String> allowedUpdates;
|
private List<String> allowedUpdates;
|
||||||
|
private ProxyType proxyType;
|
||||||
|
private String proxyHost;
|
||||||
|
private int proxyPort;
|
||||||
|
|
||||||
|
public enum ProxyType {
|
||||||
|
NO_PROXY,
|
||||||
|
HTTP,
|
||||||
|
SOCKS4,
|
||||||
|
SOCKS5
|
||||||
|
}
|
||||||
|
|
||||||
public DefaultBotOptions() {
|
public DefaultBotOptions() {
|
||||||
maxThreads = 1;
|
maxThreads = 1;
|
||||||
baseUrl = ApiConstants.BASE_URL;
|
baseUrl = ApiConstants.BASE_URL;
|
||||||
|
httpContext = HttpClientContext.create();
|
||||||
|
proxyType = ProxyType.NO_PROXY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -53,6 +66,14 @@ public class DefaultBotOptions implements BotOptions {
|
|||||||
return maxWebhookConnections;
|
return maxWebhookConnections;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HttpContext getHttpContext() {
|
||||||
|
return httpContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpContext(HttpContext httpContext) {
|
||||||
|
this.httpContext = httpContext;
|
||||||
|
}
|
||||||
|
|
||||||
public void setMaxWebhookConnections(Integer maxWebhookConnections) {
|
public void setMaxWebhookConnections(Integer maxWebhookConnections) {
|
||||||
this.maxWebhookConnections = maxWebhookConnections;
|
this.maxWebhookConnections = maxWebhookConnections;
|
||||||
}
|
}
|
||||||
@ -85,4 +106,27 @@ public class DefaultBotOptions implements BotOptions {
|
|||||||
this.exponentialBackOff = exponentialBackOff;
|
this.exponentialBackOff = exponentialBackOff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProxyType getProxyType() {
|
||||||
|
return proxyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProxyType(ProxyType proxyType) {
|
||||||
|
this.proxyType = proxyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProxyHost() {
|
||||||
|
return proxyHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProxyHost(String proxyHost) {
|
||||||
|
this.proxyHost = proxyHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getProxyPort() {
|
||||||
|
return proxyPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProxyPort(int proxyPort) {
|
||||||
|
this.proxyPort = proxyPort;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,20 @@
|
|||||||
package org.telegram.telegrambots.facilities;
|
package org.telegram.telegrambots.facilities;
|
||||||
|
|
||||||
|
import org.apache.http.config.Registry;
|
||||||
|
import org.apache.http.config.RegistryBuilder;
|
||||||
|
import org.apache.http.conn.HttpClientConnectionManager;
|
||||||
|
import org.apache.http.conn.socket.ConnectionSocketFactory;
|
||||||
import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
import org.apache.http.impl.client.ProxyAuthenticationStrategy;
|
import org.apache.http.impl.client.ProxyAuthenticationStrategy;
|
||||||
|
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||||
|
import org.apache.http.ssl.SSLContexts;
|
||||||
import org.telegram.telegrambots.bots.DefaultBotOptions;
|
import org.telegram.telegrambots.bots.DefaultBotOptions;
|
||||||
|
import org.telegram.telegrambots.facilities.proxysocketfactorys.HttpConnectionSocketFactory;
|
||||||
|
import org.telegram.telegrambots.facilities.proxysocketfactorys.HttpSSLConnectionSocketFactory;
|
||||||
|
import org.telegram.telegrambots.facilities.proxysocketfactorys.SocksSSLConnectionSocketFactory;
|
||||||
|
import org.telegram.telegrambots.facilities.proxysocketfactorys.SocksConnectionSocketFactory;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@ -16,9 +26,30 @@ public class TelegramHttpClientBuilder {
|
|||||||
public static CloseableHttpClient build(DefaultBotOptions options) {
|
public static CloseableHttpClient build(DefaultBotOptions options) {
|
||||||
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
|
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
|
||||||
.setSSLHostnameVerifier(new NoopHostnameVerifier())
|
.setSSLHostnameVerifier(new NoopHostnameVerifier())
|
||||||
|
.setConnectionManager(createConnectionManager(options))
|
||||||
.setConnectionTimeToLive(70, TimeUnit.SECONDS)
|
.setConnectionTimeToLive(70, TimeUnit.SECONDS)
|
||||||
.setMaxConnTotal(100);
|
.setMaxConnTotal(100);
|
||||||
return httpClientBuilder.build();
|
return httpClientBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static HttpClientConnectionManager createConnectionManager(DefaultBotOptions options) {
|
||||||
|
Registry<ConnectionSocketFactory> registry;
|
||||||
|
switch (options.getProxyType()) {
|
||||||
|
case NO_PROXY:
|
||||||
|
return null;
|
||||||
|
case HTTP:
|
||||||
|
registry = RegistryBuilder.<ConnectionSocketFactory> create()
|
||||||
|
.register("http", new HttpConnectionSocketFactory())
|
||||||
|
.register("https", new HttpSSLConnectionSocketFactory(SSLContexts.createSystemDefault())).build();
|
||||||
|
return new PoolingHttpClientConnectionManager(registry);
|
||||||
|
case SOCKS4:
|
||||||
|
case SOCKS5:
|
||||||
|
registry = RegistryBuilder.<ConnectionSocketFactory> create()
|
||||||
|
.register("http", new SocksConnectionSocketFactory())
|
||||||
|
.register("https", new SocksSSLConnectionSocketFactory(SSLContexts.createSystemDefault())).build();
|
||||||
|
return new PoolingHttpClientConnectionManager(registry);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
package org.telegram.telegrambots.facilities.proxysocketfactorys;
|
||||||
|
|
||||||
|
import org.apache.http.HttpHost;
|
||||||
|
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
|
||||||
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
public class HttpConnectionSocketFactory extends PlainConnectionSocketFactory {
|
||||||
|
@Override
|
||||||
|
public Socket createSocket(final HttpContext context) throws IOException {
|
||||||
|
InetSocketAddress socketAddress = (InetSocketAddress) context.getAttribute("socketAddress");
|
||||||
|
Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
|
||||||
|
return new Socket(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket connectSocket(
|
||||||
|
int connectTimeout,
|
||||||
|
Socket socket,
|
||||||
|
HttpHost host,
|
||||||
|
InetSocketAddress remoteAddress,
|
||||||
|
InetSocketAddress localAddress,
|
||||||
|
HttpContext context) throws IOException {
|
||||||
|
String hostName = host.getHostName();
|
||||||
|
int port = remoteAddress.getPort();
|
||||||
|
InetSocketAddress unresolvedRemote = InetSocketAddress.createUnresolved(hostName, port);
|
||||||
|
return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package org.telegram.telegrambots.facilities.proxysocketfactorys;
|
||||||
|
|
||||||
|
import org.apache.http.HttpHost;
|
||||||
|
import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
||||||
|
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
||||||
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
public class HttpSSLConnectionSocketFactory extends SSLConnectionSocketFactory {
|
||||||
|
|
||||||
|
public HttpSSLConnectionSocketFactory(final SSLContext sslContext) {
|
||||||
|
super(sslContext, new NoopHostnameVerifier());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket createSocket(final HttpContext context) throws IOException {
|
||||||
|
InetSocketAddress socketAddress = (InetSocketAddress) context.getAttribute("socketAddress");
|
||||||
|
Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
|
||||||
|
return new Socket(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket connectSocket(
|
||||||
|
int connectTimeout,
|
||||||
|
Socket socket,
|
||||||
|
HttpHost host,
|
||||||
|
InetSocketAddress remoteAddress,
|
||||||
|
InetSocketAddress localAddress,
|
||||||
|
HttpContext context) throws IOException {
|
||||||
|
String hostName = host.getHostName();
|
||||||
|
int port = remoteAddress.getPort();
|
||||||
|
InetSocketAddress unresolvedRemote = InetSocketAddress.createUnresolved(hostName, port);
|
||||||
|
return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package org.telegram.telegrambots.facilities.proxysocketfactorys;
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.http.HttpHost;
|
||||||
|
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
|
||||||
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
import sun.net.SocksProxy;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
public class SocksConnectionSocketFactory extends PlainConnectionSocketFactory {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket createSocket(final HttpContext context) throws IOException {
|
||||||
|
InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socketAddress");
|
||||||
|
int socksVersion = (Integer) context.getAttribute("socksVersion");
|
||||||
|
Proxy proxy = SocksProxy.create(socksaddr, socksVersion);
|
||||||
|
return new Socket(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket connectSocket(
|
||||||
|
int connectTimeout,
|
||||||
|
Socket socket,
|
||||||
|
HttpHost host,
|
||||||
|
InetSocketAddress remoteAddress,
|
||||||
|
InetSocketAddress localAddress,
|
||||||
|
HttpContext context) throws IOException {
|
||||||
|
String hostName = host.getHostName();
|
||||||
|
int port = remoteAddress.getPort();
|
||||||
|
InetSocketAddress unresolvedRemote = InetSocketAddress.createUnresolved(hostName, port);
|
||||||
|
return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package org.telegram.telegrambots.facilities.proxysocketfactorys;
|
||||||
|
|
||||||
|
import org.apache.http.HttpHost;
|
||||||
|
import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
||||||
|
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
||||||
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
import sun.net.SocksProxy;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
|
||||||
|
public class SocksSSLConnectionSocketFactory extends SSLConnectionSocketFactory {
|
||||||
|
|
||||||
|
public SocksSSLConnectionSocketFactory(final SSLContext sslContext) {
|
||||||
|
super(sslContext, new NoopHostnameVerifier());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket createSocket(final HttpContext context) throws IOException {
|
||||||
|
InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socketAddress");
|
||||||
|
int socksVersion = (Integer) context.getAttribute("socksVersion");
|
||||||
|
Proxy proxy = SocksProxy.create(socksaddr, socksVersion);
|
||||||
|
return new Socket(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Socket connectSocket(
|
||||||
|
int connectTimeout,
|
||||||
|
Socket socket,
|
||||||
|
HttpHost host,
|
||||||
|
InetSocketAddress remoteAddress,
|
||||||
|
InetSocketAddress localAddress,
|
||||||
|
HttpContext context) throws IOException {
|
||||||
|
String hostName = host.getHostName();
|
||||||
|
int port = remoteAddress.getPort();
|
||||||
|
InetSocketAddress unresolvedRemote = InetSocketAddress.createUnresolved(hostName, port);
|
||||||
|
return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context);
|
||||||
|
}
|
||||||
|
}
|
@ -245,7 +245,7 @@ public class DefaultBotSession implements BotSession {
|
|||||||
httpPost.setConfig(requestConfig);
|
httpPost.setConfig(requestConfig);
|
||||||
httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(request), ContentType.APPLICATION_JSON));
|
httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(request), ContentType.APPLICATION_JSON));
|
||||||
|
|
||||||
try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
|
try (CloseableHttpResponse response = httpclient.execute(httpPost, options.getHttpContext())) {
|
||||||
HttpEntity ht = response.getEntity();
|
HttpEntity ht = response.getEntity();
|
||||||
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
|
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
|
||||||
String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
|
String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user