Сервер отвергает мой запрос

226
24 апреля 2018, 04:43

Добрый день, столкнулся с такой проблемой. При запросе на сервер 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

Answer 1

Почитайте новости о Роскомнадзоре и Telegram:

Напомним, Роскомнадзор блокирует мессенджер Telegram с 16 апреля, исполняя решение Таганского суда Москвы. Решение суда стало следствием того, что владелец Telegram Павел Дуров отказался передать ФСБ России ключи шифрования переписки пользователей, как того требует российское законодательство, в частности, для эффективной борьбы с терроризмом.

READ ALSO
Java код Google Duo

Java код Google Duo

Нигде не могу найти Java-код/проект видео звонка Google Duo (именно его)Неужели нигде нет разработок такой интересной вещи?

198
Запрос выдаёт 403, но не в браузере

Запрос выдаёт 403, но не в браузере

Добрый деньМне нужно парсить json ответ от сервера и затем работать с ним

223
Импорт видео потока (Java)

Импорт видео потока (Java)

Существуют ли возможности импорта видеопотока из сторонней (скаченной, типа *apk) программы в свой Java-проект? То есть: что бы не создавать видео...

218