Comment procéder pour implémenter un proxy HTTP par rapport à l'implémentation d'un serveur Web HTTP, quelles sont les différences? Existe-t-il un guide définitif ou RFC ou un livre utile sur ce sujet?
Les exigences sur les serveurs proxy HTTP sont spécifiées dans
RFC7230 - Hypertext Transfer Protocol (HTTP/1.1): Syntaxe et routage des messages
L'en-tête envoyé à un proxy est différent.
Par exemple, voici ce qui est envoyé par Google Chrome à www.baidu.com via un serveur proxy:
GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Nous pouvons voir que c'est
GET http://www.baidu.com/ HTTP/1.1
au lieu de
GET / HTTP/1.1
et voici
Proxy-Connection: keep-alive
aussi
Host: www.baidu.com
Le champ hôte est obligatoire pour le proxy http.
Pour le proxy tunnel HTTPS:
CONNECT comet.zhihu.com:443 HTTP/1.1
Host: comet.zhihu.com:443
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Nous pouvons voir
CONNECT comet.zhihu.com:443 HTTP/1.1
domain:443
au lieu de https://domain
.
Le champ CONNECT transforme le serveur proxy en quelque chose comme un TCP, puis le protocole HTTPS
est remplacé par le port :443
Pour le proxy socks5, les choses deviennent faciles, car socks5 ne se soucie pas du protocole supérieur, vous lui dites simplement Host et port.
Un proxy est très similaire à un serveur; la seule différence est qu'après avoir analysé la demande, il la transmet simplement et renvoie le résultat *, plutôt que de traiter la demande elle-même. Parce que le proxy n'a pas à effectuer la même quantité de traitement qu'un serveur normal, il peut souvent s'en tirer avec une analyse des demandes beaucoup plus minimale qu'un serveur à part entière, mais sinon c'est la même idée.
* Certains proxys implémentent une mise en cache supplémentaire. Certains ont également été confrontés à la réponse/demande, mais c'est le mauvais type de proxy, que vous n'avez, je l'espère, pas en tête.