2.5.20
Google Chrome 版本 77.0.3865.90(正式版本) (64 位)
如图所示, 选择了 HTTP 类型的服务器

同时我使用 PacketSender 作为本地代理服务器, 监听 127.0.0.1:10102
然后添加一个 自动切换模式 采用 example.com 来测试(注意该网站同时提供 http 和 https 服务, 需要明确输入 https, 它不会强制重定向到 https), 如下

现在我在浏览器打开 https://example.com, PacketSender 作为本地服务器, 收到以下请求:

再次, 当我明确输入 http://example.com 时 (注意是 http 而非 https), 收到以下请求:

实际上前者是 https 代理的请求报文, 而非 http
然后, 我将代理协议改为 https

依次打开 http://example.com 和 https://example.com, 这次没有收到明文的数据, 而是加密的:

开头都是 16 03 01, 就是 tls 握手的数据了. 直接将加密的数据发送给服务器, 在我看来可能是没有意义的, 因为服务器根本无法得知要访问哪个目标/域名/网站.
可能将 SwitchyOmega 原本的 http 改为只发送 GET 请求, 而 https 只发送 CONNECT 请求会更符合直觉/语义/规范 ?
http 和 https 代理的区别网络上有很多资料, 我选择其中一篇, 其清晰地阐述了 HTTP 和 HTTPS 代理客户端发出的请求报文的区别: https://lilywei739.github.io/2017/01/25/principle_for_http_https.html
首先,SwitchyOmega 并没有实现任何协议层的东西,楼主上面描述的,都只是 Chrome 的内部实现而已。
其次 Chrome 在实现这些协议并没有问题,楼主没有搞清楚“HTTP 代理”,“HTTPS 代理”,“HTTP 代理服务器”,“HTTPS 代理服务器”这 4 个东西的概念:
| | HTTP 代理服务器 | HTTPS 代理服务器 |
|--|--|--|
|代理 HTTP 访问 | client -HTTP-> proxy-HTTP-> server | client -HTTPS-> proxy -HTTP-> server |
|代理 HTTPS 访问 | client -HTTP-> proxy-HTTPS-> server | client -HTTPS-> proxy -HTTPS-> server |
只要是代理 HTTPS 访问,浏览器与代理服务器之间只能用 CONNECT 方法,当然,如果你愿意,代理 HTTP 访问也是可以用 CONNECT 方法的,但是这样并不经济,因为 RTT 比前者多。
感谢解惑.
@winguse 打扰一下。感觉你的描述似乎不太正确,探讨一下,如果有什么问题还请指出。
HTTP 代理和 HTTPS 代理只是讲连接代理服务器的手段而已吧,连接代理服务器之后,建立 TCP 转发通道。后续传输可以使用 HTTPS 或者 HTTP。
此外 SwitchOmega 使用 HTTP 作为代理协议的时候,也是使用 CONNECT 方法来连接代理服务器的。
Most helpful comment
首先,SwitchyOmega 并没有实现任何协议层的东西,楼主上面描述的,都只是 Chrome 的内部实现而已。
其次 Chrome 在实现这些协议并没有问题,楼主没有搞清楚“HTTP 代理”,“HTTPS 代理”,“HTTP 代理服务器”,“HTTPS 代理服务器”这 4 个东西的概念:
| | HTTP 代理服务器 | HTTPS 代理服务器 |
|--|--|--|
|代理 HTTP 访问 | client
-HTTP->proxy-HTTP->server | client-HTTPS->proxy-HTTP->server ||代理 HTTPS 访问 | client
-HTTP->proxy-HTTPS->server | client-HTTPS->proxy-HTTPS->server |只要是代理 HTTPS 访问,浏览器与代理服务器之间只能用 CONNECT 方法,当然,如果你愿意,代理 HTTP 访问也是可以用 CONNECT 方法的,但是这样并不经济,因为 RTT 比前者多。