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


24

我正在寻找一个命令行工具,该工具可以侦听给定的部分,但很高兴地每个HTTP POST请求除外并转储它。

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

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

也许像这样socat TCP4-LISTEN:80,fork,bind=127.0.0.1 ...-但是socat是不够的,因为它不讲HTTP。


1
也许我不太了解这个问题,但是如果您只需要转储POST请求,则可以在netcatnc某些系统上)使用-l(监听)和-p(端口号)选项。
peterph

1
@peterph,您可以使用它nc进行部分测试-但我可以看到以下缺点:1)它不发送HTTP状态代码2)在看到关闭连接的请求后,我必须按Ctrl + D 3)它不知道然后如何应对“期望:100-继续”标头4)它不知道如何处理“传输编码:分块”标头-它可能仅显示第一个(可能是)空块
maxschlepzig,2012年

Answers:


16

简单的核心命令行工具(例如ncsocat似乎无法处理正在发生的特定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()

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

替代方法很多。web.pyBottle

(对我来说,这是非常面向Python的)


如果您不喜欢它的输出方式,则无论如何都要运行它,然后尝试执行tcpdump以下操作:

tcpdump -i lo 'tcp[32:4] = 0x484f535420'

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


1
对于发现这个非常有用的代码段的其他用户-它确实执行了要求的操作-但是如果您想查看POST正文,则为pprint.pprint(self.request.body)。注意self.request.body而不是self.body。相同self.request.headers。见tornado.readthedocs.org/en/latest/...
mozz100

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.