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

 


 

 



 

posted on 2022-11-30 22:03  silyvin  阅读(112)  评论(0)    收藏  举报