仅转储 POST 请求的通用 HTTP 服务器?

max*_*zig 32 http-logging http

我正在寻找一个命令行工具来侦听给定的部分,很高兴地排除每个 HTTP POST 请求并将其转储。

我想将它用于测试目的,即用于测试发出 HTTP POST 请求的客户端。

这意味着我正在搜索对应物curl -F(我可以使用它来将测试 HTTP POST 发送到 HTTP 服务器)。

也许类似socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...- 但 socat 是不够的,因为它不谈 HTTP。

Tob*_*ias 57

我自己也在寻找这个并遇到了 Node.js http-echo-server

npm install http-echo-server -g
PORT=8081 http-echo-server
Run Code Online (Sandbox Code Playgroud)

它接受所有请求,并将包括标头在内的完整请求回显到命令行。


ger*_*ijk 17

nc, 之类的简单核心命令行工具socat似乎无法处理正在发生的特定 HTTP 内容(数据块、传输编码等)。因此,与与真正的 Web 服务器交谈相比,这可能会产生意外的行为。因此,我的第一个想法是分享我所知道的设置小型 Web 服务器并使其只做您想做的事情的最快方法:转储所有输出。

我能想到的最短的使用Python Tornado

#!/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()
Run Code Online (Sandbox Code Playgroud)

替换该pprint行以仅输出您需要的特定字段,例如self.request.bodyself.request.headers。在上面的示例中,它在所有接口上侦听端口 8080。

替代方案很多。web.pyBottle

(我非常面向 Python,抱歉)


如果您不喜欢它的输出方式,请无论如何运行它并尝试tcpdump这样:

tcpdump -i lo 'tcp[32:4] = 0x484f535420'
Run Code Online (Sandbox Code Playgroud)

查看所有 HTTP-POST 请求的真实原始转储。或者,只需运行 Wireshark。

  • 对于发现这个非常有用的代码段的其他人 - 它执行了要求的操作 - 但如果你想查看 POST 正文,它是 `pprint.pprint(self.request.body)`。注意 `self.request.body` 而不是 `self.body`。`self.request.headers` 也是如此。见 http://tornado.readthedocs.org/en/latest/web.html#tornado.web.RequestHandler.request (2认同)

小智 8

使用nc(发音为“ netcat ”)。

你告诉它监听哪个端口

nc -kl 8888
Run Code Online (Sandbox Code Playgroud)

然后在单独的终端窗口中向其发送请求

curl localhost:8888 -d hello=world
Run Code Online (Sandbox Code Playgroud)

它会打印您发送给它的数据,在本例中是 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
Run Code Online (Sandbox Code Playgroud)

-k选项意味着它将监听请求并无限期地打印它们。如果没有该选项(即nc -l 8888),它将在第一个请求后退出。

  • 您的 nc 命令不支持 HTTP。因此,HTTP 客户端(这里是curl 命令)会阻塞等待HTTP 服务器的答复(例如一些常见的状态代码),而该答复永远不会到来。 (4认同)

小智 5

https://hub.docker.com/r/jmalloc/echo-server/

$ docker run -t --rm -p 8080:8080 jmalloc/echo-server
Unable to find image 'jmalloc/echo-server:latest' locally
latest: Pulling from jmalloc/echo-server
fbf67b0844fa: Pull complete
Digest: sha256:617a99b927c3b761621681eb4716582260391c0853b6da904e0f9f1d37785e7a
Status: Downloaded newer image for jmalloc/echo-server:latest
Echo server listening on port 8080
Run Code Online (Sandbox Code Playgroud)

邮政

$ curl -XPOST -H"ThisTook: 2 minutes to find" localhost:8080/asdf
Request served by a2d8fa109b92

HTTP/1.1 POST /asdf

Host: localhost:8080
User-Agent: curl/7.54.0
Accept: */*
Thistook: 2 minutes to find
Run Code Online (Sandbox Code Playgroud)

  • 它是一个 go 二进制文件,没有外部依赖项,它像几乎所有 go 二进制文件一样静态链接。 (2认同)