iTXTech / mirai-native

强大的 mirai 原生插件加载器
GNU Affero General Public License v3.0
371 stars 141 forks source link

缓存图片概率报错 #123

Closed liergazi closed 3 years ago

liergazi commented 3 years ago

描述这个Bug 使用的易语言插件 调用CQ_getImage 概率报错

复现步骤 图片没问题 同一张图片概率出现报错 无法复现 期望的行为 不知道是哪边的问题 希望带佬指明

截图和日志 java.io.IOException: unexpected end of stream on http://gchat.qpic.cn/... at okhttp3.internal.http1.Http1ExchangeCodec.readResponseHeaders(Http1ExchangeCodec.kt:202) at okhttp3.internal.connection.Exchange.readResponseHeaders(Exchange.kt:106) at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.kt:79) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:34) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:197) at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:502) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.io.EOFException: \n not found: limit=0 content=… at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.kt:348) at okhttp3.internal.http1.HeadersReader.readLine(HeadersReader.kt:29) at okhttp3.internal.http1.Http1ExchangeCodec.readResponseHeaders(Http1ExchangeCodec.kt:178) ... 16 more

运行环境

PeratX commented 3 years ago

这是下载出错了吧,会进行测试

liergazi commented 3 years ago

这是下载出错了吧,会进行测试

好的 感谢回复

Keyezi commented 3 years ago

这是下载出错了吧,会进行测试

我这里出现了同样的问题,但是通过浏览器GET请求没有可以正常访问下载

经测试多张图片出现同样情况,HTTP访问成功几率很小

2021-02-07 16:05:22 V/Bot.246463104: [Ym_ggDEV(732700499)] [T]-Gardevoir(2645963361) -> [mirai:image:{972BCF10-B121-95C8-3567-2C768BC6B6C5}.jpg]
2021-02-07 16:05:26 D/MiraiNative: [图片鉴黄 群消息] [CQ:image,file={972BCF10-B121-95C8-3567-2C768BC6B6C5}.jpg.mnimg]
2021-02-07 16:05:26 D/MiraiNative: [图片鉴黄 开始检查文本] 文本已经除去图片CQ码(暂时不包括其他的),请放心使用。
2021-02-07 16:05:26 D/MiraiNative: [图片鉴黄 忽略] 貌似没有文本。
2021-02-07 16:05:26 D/MiraiNative: [图片鉴黄 图片文件名] {972BCF10-B121-95C8-3567-2C768BC6B6C5}.jpg.mnimg
2021-02-07 16:05:36 E/MiraiNative: Error occurred when plugin "cc.ymgg.de-aphrodisiac" (app.dll) (ID: 0) downloading image {972BCF10-B121-95C8-3567-2C768BC6B6C5}.jpg.mnimg
io.ktor.network.sockets.ConnectTimeoutException: Connect timeout has been expired [url=http://gchat.qpic.cn/gchatpic_new/246463104/0-0-972BCF10B12195C835672C768BC6B6C5/0?term=2, connect_timeout=unknown ms]
        at io.ktor.client.features.HttpTimeoutKt.ConnectTimeoutException(HttpTimeout.kt:184)
        at io.ktor.client.engine.okhttp.OkUtilsKt$execute$$inlined$suspendCancellableCoroutine$lambda$1.onFailure(OkUtils.kt:34)
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:510)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.base/java.net.PlainSocketImpl.waitForConnect(Native Method)
        at java.base/java.net.PlainSocketImpl.socketConnect(Unknown Source)
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.base/java.net.SocksSocketImpl.connect(Unknown Source)
        at java.base/java.net.Socket.connect(Unknown Source)
        at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:119)
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:283)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:195)
        at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:249)
        at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:108)
        at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:76)
        at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:245)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
        at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:197)
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:502)
        ... 3 more
Keyezi commented 3 years ago

补充:可能有帮助的内容 https://blog.csdn.net/weixin_34185364/article/details/87977369

PeratX commented 3 years ago

是的,mirai将ktor后端从CIO换成了OkHttp,构造请求的时候我没有添加额外参数,现在会尝试指定超时和UA等参数