HttpClient ThreadSafeClientConnManager tiri “Connection reset”
-
20-09-2019 - |
Domanda
definisco HttpClient in 2 modi diversi: 1. Plain vanilla: client = new DefaultHttpClient (); 2. sicura Discussione:
DefaultHttpClient getThreadSafeHttpClient() {
HttpParams params = new BasicHttpParams();
params
.setParameter(
"http.useragent",
"Mozilla/5.0 (Linux; U; Android 1.1; en-us;dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2");
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
final SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));
final ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params,
registry);
return new DefaultHttpClient(manager, params);
}
Poi corro stesso test JUnit per entrambi i tipi di client (semplice richiesta GET). # 1 funziona sempre bene, # 2 non riesce sempre con "java.net.SocketException: Connessione ripristinata". output di debug / stacktrace può essere visto qui (sito fittizio)
Non ho mai avuto la possibilità di fare qualsiasi cosa con oggetto entità poiché errore viene generato al cliente # eseguire chiamate. Cosa c'è che sto facendo male qui?
Soluzione
Aha! Il motivo era nella definizione HTTPS con sbagliato fabbrica presa. Dovrebbe essere SSLSocketFactory
SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
sslSocketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
registry.register(new Scheme("https", sslSocketFactory, 443));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow