使用 Werkzeug 解析原始 HTTP 请求

nat*_*ill 5 python werkzeug flask

我正在为 Flask 应用程序编写模糊器。我将示例请求存储为文本文件,例如 get.txt:

GET /docs/index.html HTTP/1.1
Host: www.w3.org
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会将其解析为一个werkzeug.wrappers.Request对象,如下所示(伪代码):

from werkzeug.wrappers import Request

req = Request()

with open('get.txt') as f:
    req.parse_raw(f.read())
Run Code Online (Sandbox Code Playgroud)

但是,看起来 Werkzeug 中没有进行原始 HTTP 解析。相反,Werkzeug 从BaseHTTPServer.BaseHTTPRequestHandler获取 WSGI 环境,这需要BaseHTTPServer.HTTPServer实例来解析请求。对于这么简单的事情来说,这似乎有点矫枉过正。

我还遇到了http-parser,它更接近我想要的,但它复制了 Werkzeug 的大部分数据结构,但类型不兼容。我必须将数据从一种转换为另一种。

有没有更简单的方法可以从原始 HTTP 请求到 Werkzeug 中的 WSGI 环境(或在没有 HTTP 服务器的情况下使用 BaseHTTPRequestHandler)?

nat*_*ill 5

没有找到简单的方法来做到这一点,所以我编写了一个名为Werkzeug-Raw 的库来解析对 WSGI 环境的原始 HTTP 请求(甚至在测试客户端上打开请求)。

它的工作原理如下:

from flask import Flask, request
import werkzeug_raw

app = Flask(__name__)

environ = werkzeug_raw.environ('GET /foo/bar?tequila=42 HTTP/1.1')

with app.request_context(environ):
    print request.args  # ImmutableMultiDict([('tequila', u'42')])
Run Code Online (Sandbox Code Playgroud)

要在测试客户端上打开原始 HTTP 请求:

client = app.test_client()
rv = werkzeug_raw.open(client, 'GET /foo/bar?tequila=42 HTTP/1.1')
Run Code Online (Sandbox Code Playgroud)