5

http と https のリンクを組み合わせて HttpClient 4.2 をテストしています。

HttpClient は、最初の呼び出しからのプロトコルに固執しているようです。最初の呼び出しが http の場合、後続のすべての https 呼び出しは失敗しますが、http 呼び出しは問題ありません。およびその逆。

これが私が使用したテストコードです。

@Test
public void testNoRedirectMixed() throws ClientProtocolException, IOException {
    HttpClient httpclient = new DefaultHttpClient();
    httpclient=WebClientDevWrapper.wrapClient(httpclient);
    HttpClientParams.setRedirecting(httpclient.getParams(), false);

    {
    HttpGet httpget = new HttpGet("http://www.hotmail.com");
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    assertTrue(EntityUtils.toString(entity).indexOf("com")>0);
    }

    try {
    HttpGet httpget = new HttpGet("https://www.hotmail.com");
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();

    }catch (Exception e) {
        e.printStackTrace();
    }

    {
    HttpGet httpget = new HttpGet("http://www.baidu.com");
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    assertTrue(EntityUtils.toString(entity).indexOf("com")>0);
    }
}

2 番目のリクエスト (https) は失敗しますが、baidu リクエストは問題ありません。

原因: org.apache.http.HttpException: ルートを確立できません: 計画済み = {s}-> https://www.hotmail.com ; current = {s}-> http://www.hotmail.com at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:842)

hotmail はリクエストをリダイレクトするため、リダイレクトを無効にする必要もあります: http://www.hotmail.com -> https://www.hotmail.comまたはhttps://www.hotmail.com -> https://www.live .com . どちらの場合も、同様のエラーがスローされます。

ラッパーを以下に示します。すべての証明書を受け入れるために使用されます。

public class WebClientDevWrapper {

    public static HttpClient wrapClient(HttpClient base) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {

                public void checkClientTrusted(X509Certificate[] xcs,
                        String string) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] xcs,
                        String string) throws CertificateException {
                }

                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[]{};
                }
            };
            ctx.init(null, new TrustManager[] { tm }, null);
            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
                ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            ClientConnectionManager ccm = base.getConnectionManager();
            SchemeRegistry sr = ccm.getSchemeRegistry();
            sr.register(new Scheme("https", ssf, 443));
            DefaultHttpClient client= new DefaultHttpClient(ccm, base.getParams());
            return client;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
}
4

2 に答える 2

3

HttpClient は、ユーザーに対して完全に透過的に接続を管理できる必要があります。この問題は、4.2 リリースで導入されたリグレッションが原因である可能性があります ( HTTPCLIENT-1193 を参照)。

4.2.1 バージョンがリリースされるまでは、デフォルトの代わりに PoolingConnectionManager または SingleConnectionManager のいずれかを使用してください。

于 2012-05-25T15:32:25.950 に答える
0

1 つの接続を使用して、多数の異なるサイトと通信しようとしています。AFAIR 一意のサイトごとに新しい接続 (== 新しいクライアント) を作成する必要があります。

于 2012-05-24T14:07:44.217 に答える