Skip to content

写 http 代理服务器遇过的坑 #17

Open
@bieberg0n

Description

@bieberg0n
Owner

(ps:本文用于交学校素质扩展课作业)


我从大二开始学习关于 http 代理服务器的实现,http 代理服务器(http proxy server)是一个如果你写 tiny 版会很简单,但写成 squid 会很难的东西。

1 原理

要想明白 http 代理就得先明白 http 协议。
http 协议的 request(请求)内容,简单说就是向 web 服务器提交对某个资源的请求,比如“GET /index.html HTTP/1.1”,然后 web 服务器返回资源(比如首页)。
而在浏览器中勾上了 http 代理的选项后,浏览器会向代理服务器发送请求“GET example.com/index.html HTTP/1.1”,即命令代理服务器向 example.com 请求 index.html 资源并把资源转发过来。
参考资料:HTTP 代理原理及实现(一)

2 实现

通过对客户端的请求报文的解析,就能够了解到客户端想要的资源在哪台 web 服务器上,然后将请求报文稍加修改,变成一个普通的 http 协议报文,跟 web 服务器连接,发送报文,并把返回的内容转发给客户端就行了。(对于 https 网站的代理方式不同,这里略过,可见上面参考资料)
参考资料:用python写一个http代(和谐)理

3 坑

  • 坑1:微信朋友圈的图片服务器,对于请求报文中含有 Proxy-Connection 键就拒绝(polipo 就会被它坑到)...
  • 坑2:Win10 的 Edge 浏览器请求报文中 keep-alive 是首字母大写(Keep-alive)...
  • 坑3:http 请求报文中行与行的分割符不一定是“\r\n”,还可以是“\n”...
  • 坑4:如何处理高并发问题(多进程 / 多线程 / 异步)...
  • 坑5:微信朋友圈的图片资源请求 URL 可能是 IPv6 格式的(http://[::ffff:ip]/xxx)...
  • 坑6:待续...

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @bieberg0n

        Issue actions

          写 http 代理服务器遇过的坑 · Issue #17 · bieberg0n/blog