3
respostas

Problema com o HTTP Authenticated GET

Por favor, ajude este iniciante :)
No curso ele usa o Telnet mas esse programa é horrivel de se usar no windows. Quando a conexão é iniciada, é aberta uma janela em branco para escrever o seu texto HTTP mas sempre buga e fecha ao digitar. Por isso estou usando o Ncat. Que na pratica é bem similar. Por isso estou tendo uns problemas. Basicamente quero retornar a Pagina /pedidos atraves do Ncat/telnet.

Instalei o Ncat e estou enviando o arquivo HTTP através deste comando:

Get-Content -Path request.txt -Raw | ncat -q 1 localhost 8000

E isto está dentro do request.txt:

GET /pedidos HTTP/1.1 Host: localhost:8000 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InJvZHJpZ29nYWx2YW9ic0BnbWFpbC5jb20iLCJzZW5oYSI6IjEyMyIsImlhdCI6MTc1ODg4Njc5MywiZXhwIjoxNzU4OTI5OTkzfQ.pNRNhSV58wdKLtO1rdpBPZrTqxsexA2XTmrUMbHwKxg

A requisição que estou fazendo é um simples GET. Mas para este PATH específico, preciso de um token de acesso, que obtive executando o mesmo comando antes com o login.txt:

POST /public/login HTTP/1.1 Host: localhost:8000 Content-Type: application/json Content-Length: 46 {"email": "rodrigo@gmail.com", "senha": "123"}

Dito isto: O método POST funciona perfeitamente. Consigo enviá-lo e recebo uma resposta. O método GET não funciona bem. Nos meus logs do backend, vejo o seguinte: ![](Log do Backend )

Pensei que poderia ser algum problema de timeout, adicionei alguns no servidor, mas não funcionou.

Usei o Postman para fazer esta requisição autenticada e funcionou perfeitamente. A página foi retornada com sucesso.

Também analisei o Wireshark, mas não consegui interpretá-lo. Estes são os logs:
Com Ncat: ![](Ncat Log Wireshark )
Com Postman: ![](Postman Log Wireshark )

Espero que você possa me ajudar a descobrir por que não funciona com o Ncat quando executo um GET autenticado. Sei que não é muito crítico, mas como estou aprendendo, gostaria de mergulhar neste problema e entender a causa raiz. Além disso, o HTTP deveria ser muito simples, então não entendo por que não funciona. Isso me incomoda.

Se precisar de mais informações, terei prazer em compartilhar. Obrigado.

3 respostas

Oi, Rodrigo! Tudo bem com você?

O problema está na forma como você montou o request.txt. O servidor espera que cada informação do HTTP venha em uma linha separada e que exista uma linha em branco no final para indicar que acabou. Se tudo estiver em uma linha só, o servidor não entende e a conexão cai.

Veja como montar seu request.txt corretamente:


GET /pedidos HTTP/1.1
Host: localhost:8000
Authorization: Bearer SEU_TOKEN_AQUI
Connection: close

Regras básicas para o arquivo:

  • Cada linha deve terminar com Enter.
  • No final, coloque uma linha em branco (só apertar Enter).
  • Não coloque tudo em uma linha só.

Para enviar com o Ncat, use:


ncat localhost 8000 < request.txt

ou, se quiser que ele feche a conexão sozinho:


ncat -q 1 localhost 8000 < request.txt

Exemplo de POST para comparar:


POST /public/login HTTP/1.1
Host: localhost:8000
Content-Type: application/json
Content-Length: 46
Connection: close

{"email":"rodrigo@gmail.com","senha":"123"}

Se mesmo assim continuar dando problema, você pode usar o curl, que já cuida dessa parte automática para você. Como expliquei neste link do fórum:


curl -v http://localhost:8000/pedidos ^
  -H "Authorization: Bearer SEU_TOKEN_AQUI"

Esse comando faz a mesma requisição autenticada e ajuda a confirmar se está tudo certo com o seu servidor e token.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Olá!
O HTTP request que eu escrevi está corretamete formatado com os \r\n.
Não os escrevi em uma linha só.
Inclusive os gerei no CMD para evitar que eu adicione caracteres adicionais:

$pageReq = "GET /pedidos HTTP/1.1`r`n"
$pageReq += "Host: localhost:8000`r`n"  # use API port
$pageReq += "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InJvZHJpZ29AZ21haWwuY29tIiwic2VuaGEiOiIxMjMiLCJpYXQiOjE3NTkxNDQyMzgsImV4cCI6MTc1OTE4NzQzOH0.qiZj8RP4cGRmabMJjEoYs4EGcJ8TVXp4iu-uj5uoH_4`r`n"
$pageReq += "Connection: close`r`n"

$out = "$env:USERPROFILE\Desktop\raw_http_request.bin"
[System.IO.File]::WriteAllText($out, $pageReq, [System.Text.Encoding]::UTF8)

Get-Content -Raw "$out" | ncat localhost 8000

O arquivo aparenta estar correto:
Arquivo Gerado atraves do CMD
Há a linha em branco no final mas o erro continua:
Log Backend
O que mais eu posso fazer? Qual é a raiz desse problema? Por que o GET sem autenticação funciona e esse não? Por que isso funciona no Postman?

Oi, Rodrigo!

O GET autenticado via Ncat está falhando porque seu arquivo está sendo gravado em UTF-8 com BOM e sem garantir o CRLF CRLF final.
Quando isso acontece, o servidor recebe bytes estranhos antes do GET e não entende a requisição.
Resolva fazendo o seguinte:

1) Gere o request sem BOM e com linha em branco obrigatória

PowerShell 5.1+ (garante ASCII e CRLF)
$req =
"GET /pedidos HTTP/1.1rn" +
"Host: localhost:8000rn" +
"Authorization: Bearer SEU_TOKEN_AQUIrn" +
"Connection: closern" +
"rn" # <-- linha em branco que encerra os headers

$out = "$env:USERPROFILE\Desktop\request_http.txt"
Set-Content -Path $out -Value $req -Encoding ascii # ASCII = sem BOM

Envie pelo Ncat (fecha após EOF):
ncat -q 1 localhost 8000 < $out


2) Se preferir UTF-8 sem BOM (PowerShell 7+)
Set-Content -Path $out -Value $req -Encoding utf8NoBOM
ncat -q 1 localhost 8000 < $out


3) Confirme que não há BOM no início do arquivo
$bytes = [System.IO.File]::ReadAllBytes($out)
$bytes[0..2] | ForEach-Object { $_.ToString("X2") } -join " "
Arquivo sem BOM deve começar em 47 45 54 (letras G E T)


4) Se ainda houver problema de quebra de linha
Útil quando você não coloca rn manualmente
ncat -C -q 1 localhost 8000 < $out
No seu caso, como já usa rn, manter sem -C também funciona.


Checklist rápido do HTTP/1.1

  • Método e alvo: GET /pedidos HTTP/1.1
  • Host obrigatório: Host: localhost:8000
  • Auth: Authorization: Bearer &lt;token&gt;
  • Fim dos headers: uma linha em branco (\r\n\r\n)
  • Arquivo sem BOM no início

Com isso, o GET pelo Ncat deve retornar a página /pedidos igual ao Postman, porque o servidor vai receber direto o "GET " e entender o fim dos cabeçalhos pelo CRLF CRLF.

Fico à disposição. Abraços e bons estudos!