Java 为什么Apache HttpClient 4.5.2在非响应http代理上不超时,而是阻止流读取?

Java 为什么Apache HttpClient 4.5.2在非响应http代理上不超时,而是阻止流读取?,java,proxy,apache-httpclient-4.x,Java,Proxy,Apache Httpclient 4.x,简而言之:我想测试一些http代理。我遇到了一个似乎没有响应的代理,但是HttpClient并没有像它应该的那样超时。Stacktrace显示应用程序在读取方法时被阻止。它应该超时,但它不是。一般来说,代码经过测试,在很多其他情况下(包括超时、异常等)都能正常工作 我如何配置我的请求(是的,我在请求执行时使用它们): HttpClient正在执行的操作-已发送请求但没有响应: 09:55:06.719 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DE

简而言之:我想测试一些http代理。我遇到了一个似乎没有响应的代理,但是HttpClient并没有像它应该的那样超时。Stacktrace显示应用程序在读取方法时被阻止。它应该超时,但它不是。一般来说,代码经过测试,在很多其他情况下(包括超时、异常等)都能正常工作

我如何配置我的请求(是的,我在请求执行时使用它们):

HttpClient正在执行的操作-已发送请求但没有响应:

09:55:06.719 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.c.protocol.RequestAddCookies - CookieSpec selected: default
09:55:06.720 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.c.protocol.RequestAuthCache - Auth cache not set in the context
09:55:06.721 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection request: [route: {tls}->http://84.28.86.73:80->https://api.ipify.org:443][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]
09:55:06.722 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection leased: [id: 19][route: {tls}->http://84.28.86.73:80->https://api.ipify.org:443][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
09:55:06.723 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.impl.execchain.MainClientExec - Opening connection {tls}->http://84.28.86.73:80->https://api.ipify.org:443
09:55:06.723 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.i.c.DefaultHttpClientConnectionOperator - Connecting to /84.28.86.73:80
09:55:06.786 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG o.a.h.i.c.DefaultHttpClientConnectionOperator - Connection established 192.168.2.144:31914<->84.28.86.73:80
09:55:06.787 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.headers - http-outgoing-19 >> CONNECT api.ipify.org:443 HTTP/1.1
09:55:06.787 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.headers - http-outgoing-19 >> Host: api.ipify.org
09:55:06.788 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.headers - http-outgoing-19 >> User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_66)
09:55:06.788 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.wire - http-outgoing-19 >> "CONNECT api.ipify.org:443 HTTP/1.1[\r][\n]"
09:55:06.788 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.wire - http-outgoing-19 >> "Host: api.ipify.org[\r][\n]"
09:55:06.789 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.wire - http-outgoing-19 >> "User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_66)[\r][\n]"
09:55:06.789 [ProxyPool-ScheduledWorkers-pool-3-thread-1] DEBUG org.apache.http.wire - http-outgoing-19 >> "[\r][\n]"
09:55:06.719[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.c.protocol.RequestAddCookies-CookieSpec已选择:默认值
09:55:06.720[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.c.protocol.RequestAuthCache-未在上下文中设置验证缓存
09:55:06.721[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.i.c.PoollightTPClientConnectionManager-连接请求:[路由:{tls}->http://84.28.86.73:80->https://api.ipify.org:443][保持活动状态的总数:0;分配的路由:0,共2条;分配的总数:0,共20条]
09:55:06.722[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.i.c.PoollightTPClientConnectionManager-租用连接:[id:19][路由:{tls}->http://84.28.86.73:80->https://api.ipify.org:443][保持活动状态的总数:0;分配的路由:1/2;分配的总数:1/20]
09:55:06.723[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.impl.execchain.MainClientExec-打开连接{tls}->http://84.28.86.73:80->https://api.ipify.org:443
09:55:06.723[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.i.c.DefaultHttpClientConnectionOperator-连接到/84.28.86.73:80
09:55:06.786[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试o.a.h.i.c.DefaultHttpClientConnectionOperator-已建立连接192.168.2.144:3191484.28.86.73:80
09:55:06.787[ProxyPool-ScheduledWorkers-pool-3-thread-1]DEBUG org.apache.http.headers-http-outing-19>>CONNECT-api.ipify.org:443 http/1.1
09:55:06.787[ProxyPool-ScheduledWorkers-pool-3-thread-1]调试org.apache.http.headers-http-outing-19>>主机:api.ipify.org
09:55:06.788[ProxyPool-ScheduledWorkers-pool-3-thread-1]DEBUG org.apache.http.headers-http-outing-19>>用户代理:apache HttpClient/4.5.2(Java/1.8.066)
09:55:06.788[ProxyPool-ScheduledWorkers-pool-3-thread-1]DEBUG org.apache.http.wire-http-outing-19>>“CONNECT api.ipify.org:443 http/1.1[\r][\n]”
09:55:06.788[ProxyPool-ScheduledWorkers-pool-3-thread-1]DEBUG org.apache.http.wire-http-outing-19>>“主机:api.ipify.org[\r][\n]”
09:55:06.789[ProxyPool-ScheduledWorkers-pool-3-thread-1]DEBUG org.apache.http.wire-http-outing-19>>“用户代理:apache HttpClient/4.5.2(Java/1.8.066)[\r][\n]”
09:55:06.789[ProxyPool-ScheduledWorkers-pool-3-thread-1]DEBUG org.apache.http.wire-http-outing-19>“[\r][\n]”
这是连接被阻塞的stackrace

Thread [ProxyPool-ScheduledWorkers-pool-3-thread-1] (Suspended) 
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]    
SocketInputStream.socketRead(FileDescriptor, byte[], int, int, int) line: not available 
SocketInputStream.read(byte[], int, int, int) line: not available   
SocketInputStream.read(byte[], int, int) line: not available    
LoggingInputStream.read(byte[], int, int) line: 87  
SessionInputBufferImpl.streamRead(byte[], int, int) line: 139   
SessionInputBufferImpl.fillBuffer() line: 155   
SessionInputBufferImpl.readLine(CharArrayBuffer) line: 284  
DefaultHttpResponseParser.parseHead(SessionInputBuffer) line: 140   
DefaultHttpResponseParser.parseHead(SessionInputBuffer) line: 57    
DefaultHttpResponseParser(AbstractMessageParser<T>).parse() line: 261   
LoggingManagedHttpClientConnection(DefaultBHttpClientConnection).receiveResponseHeader() line: 165  
CPoolProxy.receiveResponseHeader() line: 167    
HttpRequestExecutor.doReceiveResponse(HttpRequest, HttpClientConnection, HttpContext) line: 272 
HttpRequestExecutor.execute(HttpRequest, HttpClientConnection, HttpContext) line: 124   
MainClientExec.createTunnelToTarget(AuthState, HttpClientConnection, HttpRoute, HttpRequest, HttpClientContext) line: 472   
MainClientExec.establishRoute(AuthState, HttpClientConnection, HttpRoute, HttpRequest, HttpClientContext) line: 397 
MainClientExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware) line: 236  
ProtocolExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware) line: 184    
RedirectExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware) line: 110    
InternalHttpClient.doExecute(HttpHost, HttpRequest, HttpContext) line: 184  
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest, HttpContext) line: 82   
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest, HttpContext) line: 55   
Ipify.getExternalIp(HttpClient, RequestConfig, HttpContext) line: 48    
Ipify.getExternalIp(HttpClient, HttpContext) line: 33   
<obsolete method in<unknown declaring type>>    
ProxyTester.isHttpsProxyValidQuiet(HttpsProxyHost) line: 105    
FetchProxiesFromSourceTask.run() line: 72   
Executors$RunnableAdapter<T>.call() line: not available 
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>(FutureTask<V>).runAndReset() line: not available 
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.access$301(ScheduledThreadPoolExecutor$ScheduledFutureTask) line: not available  
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.run() line: not available    
ScheduledThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available    
Thread[ProxyPool-ScheduledWorkers-pool-3-Thread-1](挂起)
SocketInputStream.socketRead0(文件描述符,字节[],int,int,int)行:不可用[本机方法]
SocketInputStream.socketRead(文件描述符,字节[],int,int,int)行:不可用
SocketInputStream.read(字节[],int,int,int)行:不可用
SocketInputStream.read(字节[],int,int)行:不可用
LoggingInputStream.read(字节[],int,int)行:87
SessionInputBufferImpl.streamRead(字节[],int,int)行:139
SessionInputBufferImpl.fillBuffer()行:155
SessionInputBufferImpl.readLine(CharArrayBuffer)行:284
DefaultHttpResponseParser.parseHead(SessionInputBuffer)行:140
DefaultHttpResponseParser.parseHead(SessionInputBuffer)行:57
DefaultHttpResponseParser(AbstractMessageParser).parse()行:261
LoggingManagedHTTPClient连接(默认BHTTPClientConnection)。接收方负责人()行:165
CPoolProxy.receiveResponseHeader()行:167
HttpRequestExecutor.doReceiveResponse(HttpRequest、HttpClientConnection、HttpContext)行:272
执行(HttpRequest、HttpClientConnection、HttpContext)行:124
MainClientExec.createTunnelToTarget(AuthState、HttpClientConnection、HttpRoute、HttpRequest、HttpClientContext)行:472
MainClientExec.establishRoute(AuthState、HttpClientConnection、HttpRoute、HttpRequest、HttpClientContext)行:397
MainClientExec.execute(HttpRoute,HttpRequestWrapper,HttpClientContext,HttpExecutionAware)行:236
ProtocolExec.execute(HttpRoute,HttpRequestWrapper,HttpClientContext,HttpExecutionAware)行:184
执行(HttpRoute,HttpRequestWrapper,HttpClientContext,HttpExecutionAware)行:110
InternalHttpClient.doExecute(HttpHost、HttpRequest、HttpContext)行:184
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest,HttpContext)行:82
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest,HttpContext)行:55
getExternalIp(HttpClient、RequestConfig、HttpContext)行:48
getExternalIp(HttpClient,HttpContext)行:33
ProxyTester.IsHttpProxyValidQuiet(HttpProxyHost)线路:105
FetchProxiesFromSourceTask.run()行:72
Executors$RunnableAdapter.call()行:不可用
ScheduledThreadPoolExecutor$ScheduledFutureTask(FutureTask)。runAndReset()行:不可用
ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor$ScheduledFutureTask)行:不可用
ScheduledThreadPoolExecutor$ScheduledFutureTask.run()行:不可用
ScheduledThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker)行:不可用
ThreadPoolExecutor$Worker.run()行:不可用
Thread.run()行:不可用
编辑:荣誉奖:

在我看来,这是一个设计缺陷,因为无法根据请求设置
soTimeout
之前的SSL握手

并在此处报告错误:

Thread [ProxyPool-ScheduledWorkers-pool-3-thread-1] (Suspended) 
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]    
SocketInputStream.socketRead(FileDescriptor, byte[], int, int, int) line: not available 
SocketInputStream.read(byte[], int, int, int) line: not available   
SocketInputStream.read(byte[], int, int) line: not available    
LoggingInputStream.read(byte[], int, int) line: 87  
SessionInputBufferImpl.streamRead(byte[], int, int) line: 139   
SessionInputBufferImpl.fillBuffer() line: 155   
SessionInputBufferImpl.readLine(CharArrayBuffer) line: 284  
DefaultHttpResponseParser.parseHead(SessionInputBuffer) line: 140   
DefaultHttpResponseParser.parseHead(SessionInputBuffer) line: 57    
DefaultHttpResponseParser(AbstractMessageParser<T>).parse() line: 261   
LoggingManagedHttpClientConnection(DefaultBHttpClientConnection).receiveResponseHeader() line: 165  
CPoolProxy.receiveResponseHeader() line: 167    
HttpRequestExecutor.doReceiveResponse(HttpRequest, HttpClientConnection, HttpContext) line: 272 
HttpRequestExecutor.execute(HttpRequest, HttpClientConnection, HttpContext) line: 124   
MainClientExec.createTunnelToTarget(AuthState, HttpClientConnection, HttpRoute, HttpRequest, HttpClientContext) line: 472   
MainClientExec.establishRoute(AuthState, HttpClientConnection, HttpRoute, HttpRequest, HttpClientContext) line: 397 
MainClientExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware) line: 236  
ProtocolExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware) line: 184    
RedirectExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware) line: 110    
InternalHttpClient.doExecute(HttpHost, HttpRequest, HttpContext) line: 184  
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest, HttpContext) line: 82   
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest, HttpContext) line: 55   
Ipify.getExternalIp(HttpClient, RequestConfig, HttpContext) line: 48    
Ipify.getExternalIp(HttpClient, HttpContext) line: 33   
<obsolete method in<unknown declaring type>>    
ProxyTester.isHttpsProxyValidQuiet(HttpsProxyHost) line: 105    
FetchProxiesFromSourceTask.run() line: 72   
Executors$RunnableAdapter<T>.call() line: not available 
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>(FutureTask<V>).runAndReset() line: not available 
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.access$301(ScheduledThreadPoolExecutor$ScheduledFutureTask) line: not available  
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.run() line: not available    
ScheduledThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: not available    
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available