Quando um cliente HTTP envia uma solicitação GET
, o nome do host de destino é geralmente não no URI solicitado. Isto é, em vez de enviar
GET http://www.gstatic.com/generate_204 HTTP/1.1
um cliente HTTP 1.1 envia:
GET /generate_204 HTTP/1.1
Host: www.gstatic.com
Como o cliente "sabe" que precisa resolver o nome DNS "www.gstatic.com" para um endereço IP e enviar a solicitação HTTP para esse endereço IP, ele realmente não precisa incluir o nome do host < em> novamente como parte do caminho solicitado. O cabeçalho Host
é uma dica para o servidor do nome do host originalmente solicitado.
Observe que a semântica acima é abordada por RFC 7230, Seção 5.3 . E lá, faz afirmar que a "forma absoluta" do recurso solicitado / alvo poderia incluir o esquema e o nome do host; é a "forma de origem" que descrevi acima. Se o seu servidor de origem / destino retorna "400 Bad Request" para o "formulário absoluto" que seu proxy está usando, ele sugere a) que o servidor não suporta o "formulário absoluto", ou b) algo está errado (faltando Host
request header?).
Isso significa que o seu proxy HTTP não deve realmente confiar no nome do host de destino que está na primeira linha da solicitação HTTP (para um cliente HTTP poderia usar o "formulário de origem" do pedido / target resource; em vez disso, o seu proxy deve procurar pelo Host
header, caso você precise saber dessa informação. E para evitar o 400 Bad Request
do servidor de origem, recomendo que o seu proxy envie eg :
GET /generate_204 HTTP/1.1
Host: www.gstatic.com
Para a semântica do método CONNECT
, consulte RFC 7231, Seção 4.3.6 . Lá, vemos que o recurso solicitado deve consistir no nome do host e na porta. Qualquer resposta 2xx
do servidor de destino indica sucesso; qualquer outro código de resposta indica que o "túnel" solicitado não está configurado. O resto do RFC vale a pena ler, para outros casos de limites e comportamentos.
Espero que isso ajude!