Добрый день, столкнулся с такой проблемой.
При запросе на сервер https://api.telegram.org
он отвечает мне
400 The plain HTTP request was sent to HTTPS port
Вот код программы:
public class Main {
public static void main(String[] args)throws Exception {
Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", new MyConnectionSocketFactory())
.register("https", new MySSLConnectionSocketFactory(
SSLContexts.createSystemDefault(),
new String[] { "TLSv1", "SSLv3" }, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier()))
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLHostnameVerifier(SSLConnectionSocketFactory.getDefaultHostnameVerifier())
.setConnectionManager(cm)
.build();
try {
InetSocketAddress socksaddr = new InetSocketAddress("mysockeyaddres", 8080);
HttpClientContext context = HttpClientContext.create();
context.setAttribute("socks.address", socksaddr);
HttpHost target = new HttpHost("api.telegram.org", 443, "https");
HttpGet request = new HttpGet("/");
System.out.println("Executing request " + request + " to " + target + " via SOCKS proxy " + socksaddr);
System.out.println(request.toString());
CloseableHttpResponse response = httpclient.execute(target, request, context);
String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
try {
System.out.println("----------------------------------------");
System.out.println(response.toString());
System.out.println(responseString);
EntityUtils.consume(response.getEntity());
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
static class MyConnectionSocketFactory implements ConnectionSocketFactory {
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);
}
public Socket connectSocket(
final int connectTimeout,
final Socket socket,
final HttpHost host,
final InetSocketAddress remoteAddress,
final InetSocketAddress localAddress,
final HttpContext context) throws IOException, ConnectTimeoutException {
Socket sock;
if (socket != null) {
sock = socket;
} else {
sock = createSocket(context);
}
if (localAddress != null) {
sock.bind(localAddress);
}
try {
sock.connect(remoteAddress, connectTimeout);
} catch (SocketTimeoutException ex) {
throw new ConnectTimeoutException(ex, host, remoteAddress.getAddress());
}
return sock;
}
}
static class MySSLConnectionSocketFactory extends SSLConnectionSocketFactory {
public MySSLConnectionSocketFactory(final SSLContext sslContext) {
super(sslContext);
}
public MySSLConnectionSocketFactory(SSLContext createDefault, HostnameVerifier defaultHostnameVerifier) {
super(createDefault, defaultHostnameVerifier);
}
public MySSLConnectionSocketFactory(SSLContext sslContext, String[] supportedProtocols, String[] supportedCipherSuites, HostnameVerifier hostnameVerifier) {
super(sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier);
}
@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);
}
public Socket connectSocket(
final int connectTimeout,
final Socket socket,
final HttpHost host,
final InetSocketAddress remoteAddress,
final InetSocketAddress localAddress,
final HttpContext context) throws IOException, ConnectTimeoutException {
Socket sock;
if (socket != null) {
sock = socket;
} else {
sock = createSocket(context);
}
if (localAddress != null) {
sock.bind(localAddress);
}
try {
sock.connect(remoteAddress, connectTimeout);
} catch (SocketTimeoutException ex) {
throw new ConnectTimeoutException(ex, host, remoteAddress.getAddress());
}
return sock;
}
}
}
Запрос делаю используя Apache httpclient-4.5.5
и сокеты пятой версии.
Update: Вопрос закрыт, спасибо @zRrr , за, по сути, ответ на мой вопрос. Для решения проблемы необходимо создать новый экземпляр класса SSLConnectionSocketFactory, но изменить несколько методов с private на protected, чтобы переопределить метод connectSocket
Почитайте новости о Роскомнадзоре и Telegram:
Напомним, Роскомнадзор блокирует мессенджер Telegram с 16 апреля, исполняя решение Таганского суда Москвы. Решение суда стало следствием того, что владелец Telegram Павел Дуров отказался передать ФСБ России ключи шифрования переписки пользователей, как того требует российское законодательство, в частности, для эффективной борьбы с терроризмом.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На данный вопрос уже ответили:
Нигде не могу найти Java-код/проект видео звонка Google Duo (именно его)Неужели нигде нет разработок такой интересной вещи?
Добрый деньМне нужно парсить json ответ от сервера и затем работать с ним
Существуют ли возможности импорта видеопотока из сторонней (скаченной, типа *apk) программы в свой Java-проект? То есть: что бы не создавать видео...