나는 주어진 섹션을 듣고 모든 HTTP POST 요청을 제외하고 덤프할 수 있는 명령줄 도구를 찾고 있습니다.
테스트 목적, 즉 HTTP POST 요청을 하는 클라이언트를 테스트하는 데 사용하고 싶습니다.
이는 해당 콘텐츠 curl -F
(HTTP 서버에 테스트 HTTP POST를 보내는 데 사용할 수 있음)를 검색하고 있음을 의미합니다.
어쩌면 그런 것일 수도 있지만 socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...
socat은 HTTP를 지원하지 않기 때문에 충분하지 않습니다.
답변1
나도 이거 찾고 있는데Node.js http-echo-server와의 만남:
npm install http-echo-server -g
PORT=8081 http-echo-server
모든 요청을 수락하고 전체 요청(헤더 포함)을 명령줄에 표시합니다.
답변2
간단한 핵심 명령줄 도구(예: http://github.com nc
)는 socat
진행 중인 특정 HTTP 작업(청크, 전송 인코딩 등)을 처리할 수 없는 것 같습니다. 따라서 실제 웹 서버와 통신할 때와 비교하여 예상치 못한 동작이 발생할 수 있습니다. 그래서 나의 첫 번째 생각은 작은 웹 서버를 설정하고 원하는 작업을 수행하도록 만드는 가장 빠른 방법, 즉 모든 출력을 덤프하는 방법을 공유하는 것이었습니다.
제가 생각하는 가장 짧은 사용시간은파이썬 토네이도:
#!/usr/bin/env python
import tornado.ioloop
import tornado.web
import pprint
class MyDumpHandler(tornado.web.RequestHandler):
def post(self):
pprint.pprint(self.request)
pprint.pprint(self.request.body)
if __name__ == "__main__":
tornado.web.Application([(r"/.*", MyDumpHandler),]).listen(8080)
tornado.ioloop.IOLoop.instance().start()
또는 pprint
와 같이 필요한 특정 필드만 출력하려면 이 줄을 바꾸십시오 . 위의 예에서는 모든 인터페이스의 포트 8080에서 수신 대기합니다.self.request.body
self.request.headers
이에 대한 많은 대안이 있습니다.network.py,병, 등.
(저는 Python 지향적입니다. 죄송합니다.)
출력 방식이 마음에 들지 않으면 실행하고 tcpdump
다음을 시도해 보십시오.
tcpdump -i lo 'tcp[32:4] = 0x484f535420'
모든 HTTP-POST 요청의 실제 원시 덤프를 봅니다. 또는 Wireshark를 실행하세요.
답변3
사용 nc
("으로 발음)인터넷 고양이").
어느 포트에서 수신 대기할지 알려줍니다.
nc -kl 8888
그런 다음 별도의 터미널 창에서 요청을 보냅니다.
curl localhost:8888 -d hello=world
전송한 데이터(이 경우 HTTP 요청)를 인쇄합니다.
POST / HTTP/1.1
Host: localhost:8888
User-Agent: curl/7.84.0
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
hello=world
이 -k
옵션은 요청을 수신하고 무기한 인쇄한다는 의미입니다. 해당 옵션이 없으면(예: nc -l 8888
) 첫 번째 요청 후에 종료됩니다.
답변4
Python 표준 라이브러리는 배터리와 함께 제공됩니다. 즉, 간단한 HTTP 요청 덤퍼를 작성하는 데 사용할 수 있는 HTTP 서버 패키지도 포함되어 있습니다.
#!/usr/bin/env python3
import argparse
import http.server
import json
import sys
class Dumper(http.server.BaseHTTPRequestHandler):
def do_GET(self, method='GET'):
print(f'\n{method} {self.path}\n{self.headers}')
self.send_response(200)
self.end_headers()
def do_DELETE(self):
return self.do_GET('DELETE')
def do_POST(self, method='POST'):
n = int(self.headers.get('content-length', 0))
body = self.rfile.read(n)
print(f'\n{method} {self.path}\n{self.headers}{body}\n')
if self.headers.get('content-type') == 'application/json':
d = json.loads(body)
print(json.dumps(d, indent=4, sort_keys=True))
print()
self.send_response(200)
self.end_headers()
def do_PUT(self):
return self.do_POST('PUT')
def log_message(self, format, *args):
pass
일부 샘플:
def main():
p = argparse.ArgumentParser(description='Dump HTTP requests to stdout')
p.add_argument('address', help='bind address')
p.add_argument('port', type=int, help='bind port')
xs = p.parse_args();
s = http.server.HTTPServer((xs.address, xs.port), Dumper)
s.serve_forever()
if __name__ == '__main__':
sys.exit(main())
또한보십시오:내 테이크아웃