수동 HTTP (S) 요청


10

수동 HTTP 또는 HTTPS 요청을 수행 할 수있는 도구 (Linux 일 수 있음)를 찾고 있습니다. 수동으로, 나는 정말로 그것을 의미합니다 : 나는 그것을 보이는 텍스트 파일을 공급할 수 있어야합니다

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11

Hello world

도착 URL (www.example.com/foo)을 입력하고 요청을 URL로 보냅니다. 대부분 Content_Length 헤더가 자동으로 계산 된 경우 유용합니다.

파이썬에서 httplib와 같은 라이브러리를 사용하여 이러한 도구를 작성할 수는 있지만 필요한 이유는 그러한 라이브러리에 문제가있을 때 수동 조사를 수행하는 것입니다.


답변:


10

wget 에는 --post-file 옵션이 있습니다.

편집 : 또한 Ncat 이 있으며 Randolf Richardson의 telnet 제안과 비슷한 방식으로 SSL / HTTPS도 지원한다는 점을 제외하고 사용합니다.

ncat -C --ssl www.example.com 443 < input.txt > output.txt

6
HTTPS가 필요한 경우 netcat 대신 openssl을 사용하십시오. openssl s_client -connect <address> : 443
Ambroz Bizjak

1
wget --post-file은 헤더를 추가하고 요청 본문에만 지정된 파일을 사용합니다.
David Balažic

6

HTTP (HTTPS가 아님)의 경우 "wget"명령에 대한 대안은 다음과 같이 텔넷을 사용하는 것입니다.

  • 텔넷 호스트 이름 80 <input.txt> output.txt

"input.txt"파일은 호스트 이름으로 호스트에 피드하려는 사전 설정 명령 목록이며 "output.txt"파일은 응답을 저장합니다.


1
이것은 netcat이 SSL을 지원하는지, 그리고 SSL을 지원하는 netcat 복제 본인 Ncat이 있는지 궁금해했습니다.
Chris Acheson

@Chris Acheson (+1) : 환상적입니다! 내가 작성한 내용을 별도의 답변으로 자유롭게 복사하여 NetCat을 활용하는 솔루션에 적용하십시오 (이 경우 답변에 투표하겠습니다).
Randolf Richardson

1

OpenSSL로 GET 요청을 발행 할 수 있습니다.

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

"HTTP / 2"를 사용할 수도 있지만 일부 서버 (예 : github.com)는이를 지원하지 않으므로주의하십시오.


0

나를 위해, 그것은 요청 파일을 만드는 작업 (예 : request.txt)

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: close

Hello world

그런 다음 openssl s_client명령 을 호출하십시오 .

cat request.txt | openssl s_client -quiet -connect www.example.com:443

그러나 몇 가지 사항에주의하십시오.

  • 파일 , 특히 컨텐츠 본문이 올바르게 인코딩 되어야합니다 . Content-type: text/plain; charset=utf-8파일이 UTF-8로 인코딩 된 경우 헤더를 포함하는 것이 좋습니다.
  • 헤더 의 줄 끝CR / LF 이어야합니다 . HTTP/1.1 505 HTTP Version Not Supported표준 HTTP 프로토콜은 줄 끝을 위해 CR / LF를 사용하기 때문에 웹 서버는 LF 만 사용할 수 있습니다 ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). unix2dos명령을 사용 하여이 변환을 수행 할 수 있습니다 .
  • Connection: close요청을 종료하고 호출에서 복귀하려면 헤더를 추가하십시오 . 그렇지 않으면 서버가 일반적으로 Connection: keep-alive헤더로 응답하는 경우 명령이 사용자 상호 작용을 기다리고 있습니다 .

-1

나는 아무도 cURL을 언급하지 않은 것에 놀랐다 . 당신이하고 싶은 일을 위해 정확하게 만들어졌습니다 . 또한 거의 모든 플랫폼 (Windows 포함)에서 사용할 수 있습니다.

따라서 귀하의 예를 들면 다음과 같습니다.

curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com

Wireshark에서 캡처 한 것은 다음과 같습니다.

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11

Hello world

모든 종류의 작업을 수행하려는 경우 (예 : 사용자 에이전트 변경 등) 헤더를 쉽게 추가로 수정할 수 있습니다.

편집 : "파일에서"요구 사항을 알지 못했습니다. 일반 ASCII 또는 이진 파일 중 하나를 수행 할 수도 있습니다. @ 기호로 파일 이름을 지정하기 만하면됩니다.

-d @/tmp/HelloWorldFile

curl은 거의 내가 원하는 것이지만 명령 줄에 헤더를 지정해야하므로 매우 비실용적입니다. 파일에서 메소드와 헤더를 포함하여 요청 의 전체 텍스트 를 지정할 수있는 것이 필요 하며 ncat은 원하는대로 간절히 수행합니다. 어쨌든 감사합니다 :-)
Andrea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.