首页 文章

移动Chrome / Opera中的Netty HTTP服务器和数据压缩代理 - 一些图像不可见

提问于
浏览
0

我用java编写了一个小的http服务器,以Netty为核心 . 问题是移动浏览器没有显示一些图像,当启用数据压缩代理时(Chrome中的数据保护程序,歌剧中的流量节约器)在PC上一切正常,在手机上,连接到Wi-Fi(禁用压缩)一切都是还可以,但是当手机在gsm网络中工作时(没有Wi-Fi),一些图像不可见 . 在opera(android版本)中相同 - 当禁用压缩时,所有图片都可见,启用时 - 有些图片不可见 . 示例:http://tdpol.ru/template/imgs/404.jpg < - 此图像不可见http://tdpol.ru/template/imgs/map-sm.jpg < - 此图像可见两个图像以相同方式返回给客户端,响应为200(OK) Headers 为:

CONTENT_TYPE, "image/jpeg"
CONNECTION, HttpHeaderValues.CLOSE
CONTENT_LENGTH, response.content().readableBytes()

ChannelHandlerContext用retain编写,然后关闭,解码器被破坏:

ctx.writeAndFlush(response.retain());
ctx.close();
decoder.destroy();

我应该如何实现压缩代理才能正常运行?我尝试设置304响应代码

以下是启用压缩的失败图片的 Headers (通过gsm网络):

Request header: Host: tdpol.ru
Request header: Connection: keep-alive
Request header: Cache-Control: max-age=0
Request header: Upgrade-Insecure-Requests: 1
Request header: User-Agent: Mozilla/5.0 (Linux; Android 5.0; ASUS_Z00AD    Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36
Request header: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Request header: Referer: http://tdpol.ru/ca2
Request header: Accept-Encoding: gzip, deflate, sdch
Request header: Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Request header: Cookie: _ym_uid=1472566224516803345
Response header: content-type: image/jpeg
Response header: connection: close
Response header: content-length: 52249

以下是禁用压缩的相同图片的 Headers (通过Wi-Fi)

Request header: Host: tdpol.ru
Request header: Connection: keep-alive
Request header: Cache-Control: max-age=0
Request header: Upgrade-Insecure-Requests: 1
Request header: User-Agent: Mozilla/5.0 (Linux; Android 5.0; ASUS_Z00AD Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36
Request header: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Request header: Referer: http://tdpol.ru/ca2
Request header: Accept-Encoding: gzip, deflate, sdch
Request header: Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Request header: Cookie: _ym_uid=1472566224516803345
Response header: content-type: image/jpeg
Response header: connection: close
Response header: content-length: 52249
//Here chrome requests also favicon.ico:
Request header: Host: tdpol.ru
Request header: Connection: keep-alive
Request header: Pragma: no-cache
Request header: Cache-Control: no-cache
Request header: User-Agent: Mozilla/5.0 (Linux; Android 5.0; ASUS_Z00AD Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36
Request header: Accept: */*
Request header: Referer: http://tdpol.ru/template/imgs/404.jpg
Request header: Accept-Encoding: gzip, deflate, sdch
Request header: Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Request header: Cookie: _ym_uid=1472566224516803345
Response header: content-type: image/ico
Response header: connection: close
Response header: content-length: 1150

我可以看到,它们是相同的,唯一的区别 - 没有压缩chrome请求获取图像后的favicon.ico文件在两种情况下都没有关于缓存有效性的请求(如果文件被修改),因此它不是同步错误 .

附:我已经尝试重新打包图像(原始版本用photoshop保存,尝试绘制,以防代理的重新采样器无法管理它)并重命名它(如果代理包含缓存中的一些错误样本) - 没有任何帮助 .

1 回答

  • 0

    好吧,想通了代理不是应该责备的,它只是默认用于SLOWER(重要)连接问题是在writeAndFlush和close之间的延迟 - 在高速直接连接上50kb文件在实际强制通道关闭之前被刷新,在慢速上连接只传输了部分文件,因此代理无法压缩它 . 使用慢速直接连接进行测试表明仅传输了部分图像 . 删除关闭和重置 - 固定情况 . 所以Close必须在ChannelFuture(或ChannelFuture的完整事件监听器)中实现

相关问题