POST 요청만 덤프하는 일반 HTTP 서버?

POST 요청만 덤프하는 일반 HTTP 서버?

나는 주어진 섹션을 듣고 모든 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.bodyself.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())

또한보십시오:내 테이크아웃

관련 정보