monkeyWie / proxyee

HTTP proxy server,support HTTPS&websocket.MITM impl,intercept and tamper HTTPS traffic.
MIT License
1.5k stars 566 forks source link

连接建立一段时间后,会稳定出现HTTP2超时异常 #275

Open Cricin opened 1 year ago

Cricin commented 1 year ago

大佬你好。我的使用场景是不开启ssl解码,直接connect转发。 Proxyee版本是1.7.4,客户端是OkHttp,版本3.12.0。 连接建立之后可以正常访问。但是大概20到30秒之后继续请求,就会稳定出现超时异常。 堆栈信息是这样的

java.net.SocketTimeoutException: timeout
    at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2Stream.java:656)
    at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.java:664)
    at okhttp3.internal.http2.Http2Stream.takeHeaders(Http2Stream.java:153)
    at okhttp3.internal.http2.Http2Codec.readResponseHeaders(Http2Codec.java:131)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
    at okhttp3.RealCall.execute(RealCall.java:92)

基本是稳定复现,修改超时大小好像也没用,貌似是连接挂掉了?直连的话是不会出现这问题的。 WebSocket我也在用,是没有问题的,连几个小时都可以正常工作。 对了,强制OkHttp使用HTTP1.1貌似可以解决,是不是Proxyee对HTTP2有什么特殊限制的。

另外感谢大佬做的这个库。真的很好用!

monkeyWie commented 1 year ago

没做啥限制,我看看能不能复现下吧,是一直有在请求吗

Cricin commented 1 year ago

好像是okhttp只要复用连接就会稳定出这个问题,http1.1也会有,如果不指定connection: closed的话。我的复现方法是一秒请求一次百度首页(http1.1 keeplive), 大概30秒之后就会稳定出现超时,后续请求okhttp又会自动创建新的连接,这时候又可以了,然后就开始循环这个过程。但是websocket完全没这问题,就很奇怪。

monkeyWie commented 1 year ago

应该是netty http客户端默认的keepalive时间比你的小导致的,你把okhttp的时间调小点再试试呢