http代理服务器(七)让浏览器阻塞【重点】
0 目标
证明 http response 中 length和encode 必有其一
1 前提
要让浏览器用长连接 持久连接
1.1 浏览器缓存

巨多304,

出现length为0,没有encode的response被浏览器成功解析,所以要先干掉缓存
1.2 短链接不要
此前我们的程序为了兼容MyFiddler,搞成了短链接,这里删除ctx.close
因为浏览器收到FIN包,必能解析
做个试验:
| close | keep alive | remove encode | |
| no | not care | yes |

删除返回浏览器的encode头,证明没有这个头的短连接也能解析,浏览器收到FIN包开始解析

结果:顺利出页面

都是200, 证明清理缓存成功

没有length和encode两个头

27条连接全都关闭

27条连接由服务端(代理服务器8990)主动关闭
1.3 让浏览器一直复用连接
| close | keep alive | remove encode | |
| no | origin (half with timeout) | no |

清缓存
浏览器访问
清缓存
浏览器访问
不再对200截图(证明清了缓存)

超过6 且有release,说明说明浏览器没复用6条连接

均由浏览器端发起断开

可能跟这个有关系,但是不一定,这个现象并不是100%复现,还是调整一下再试验一下:

| close | keep alive | remove enced | |
| no | yes | no |
没什么用,浏览器还是会切断连接,不过这对我们的试验主题也没啥影响,因为本节中已经证明了所有情况均是由浏览器发起切断,且是在解析完reponse之后,我们如果阻塞后走不到这一步
1.4 配置化长短连接
此前由于模仿Fiddler泛代理,用长连接导致代理服务器太多连接
而定向代理,理应使用浏览器request指定的长短方式,(代理偷懒直接使用长连接)
所以需要配置化,里面有一个点 netty close加在哪里?


channelFuture.sync() 阻塞等待发送完
2 阻塞


6个请求不返回,页面变白

没有那两个头
3 跨端口
| localhost:8990 | |
| 阻塞 6条连接 | |
| localhost:8991 | |
| 新开6条连接,阻塞 |
本文证明
1 短连接下http无需length和encode至少有一,FIN包就行
2 长连接下http需要,否则会阻塞
3 浏览器开6条连接,同步协议;6的限制为 host+port,跨port可以新开连接
4 浏览器有可能会在一段时间后切断连接,即使response加了keepalive
浙公网安备 33010602011771号