Como enviar adequadamente as solicitações GET e CONNECT do proxy para o cliente?

0

Estou fazendo um proxy HTTP em C ++; quando um cliente envia uma solicitação GET ou CONNECT para o proxy, o proxy analisa o cabeçalho HTTP do pacote, resolve o nome do host nele, abre outro soquete para o destino do servidor e envia a solicitação do cliente. Em seguida, o proxy enviará a resposta do servidor ao cliente.

Veja, por exemplo, o que o proxy envia ao servidor quando recebe uma solicitação GET ou uma solicitação CONNECT do cliente:

GET http://www.gstatic.com/generate_204 HTTP/1.1

CONNECT cr-input.getspeakit.com:443 HTTP/1.1

Mas quando eu analiso uma resposta GET do servidor, encontro um código de status 400, ou seja, Bad Request : parece ser (da Wikipedia):

a malformed request syntax, invalid request message framing, or deceptive request routing.

Eu envio argumentos errados para o servidor na solicitação GET ?

    
por elmazzun 19.03.2016 / 23:17

1 resposta

0

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!

    
por 19.03.2016 / 23:50