HttpsURLConnection openConnection Query - PullRequest
       147

HttpsURLConnection openConnection Query

0 голосов
/ 28 апреля 2018

Я использую JAVA Class HttpsURLConnection для получения контента с веб-сайта HTTPS. Я использую свой SSLSocketFactory.

Фрагмент кода ниже:

 HttpsURLConnection conn = (HttpsURLConnection) new java.net.URL("https", google.com, 443, "/").openConnection();

                conn.setHostnameVerifier(new hver());
                conn.setReadTimeout(0);
                conn.setSSLSocketFactory(my.sslSocketFactory);//mine
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setDoInput(true);
                conn.setDoOutput(true);

                conn.connect();  

Если вы видите первый метод createSocket(...), HttpsURLConnection сам создает объект Socket 'so' и передает его в качестве параметра. Есть ли способ создать этот «так» объект из моего кода. Другими словами, могу ли я заставить HttpsURLConnection вызывать другие createSocket() методы, которые принимают только порт хоста в качестве параметра. Я хочу сделать исходный объект сокета только из моего кода.

public class CustomSocketFactoty extends SSLSocketFactory {

    // method 1  
    @Override
    public Socket createSocket(*Socket so*, String host, int port,
                               boolean autoClose) throws IOException {

        // HttpsURLConnection itself creating ( in parameter )socket object Socket so  and passing it here , Instead  I want to create that Socket object so from my code.
        // it is  called from - conn.connect();
        return ...;
    }



    @Override
    public Socket createSocket(String host, int port) throws IOException,
            UnknownHostException {
             // This method never called
        return ...;
    }

    @Override
    public Socket createSocket(InetAddress host, int port) throws IOException {
     // This method never called
        return ...;
    }

    @Override
    public Socket createSocket(InetAddress address, int port,
                               InetAddress localAddress, int localPort) throws IOException {
     // This method never called
        return ...;
    }

    @Override
    public Socket createSocket(InetAddress address, int port,
                               InetAddress localAddress, int localPort) throws IOException {
        // This method never called
        return ...;
    }


}

Спасибо

1 Ответ

0 голосов
/ 28 апреля 2018

Это должно быть возможно с HttpsURLConnection. Смотрите этот пример:

http://rtfcode.com/xref/java-1.8/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsSocketFacTest.java#L168

Возможно, вы захотите проверить, является ли данный сокет нулевым в вашей реализации createSocket.

Вы также можете использовать HTTP-клиент Apache. Вы можете предоставить реализацию SSLConnectionSocketFactory, которая переопределяет ConnectionSocketFactory.connectSocket. Это создает начальный сокет.

См. Пример «Пользовательский контекст SSL»:

http://hc.apache.org/httpcomponents-client-ga/examples.html

http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java

...