我正在为Flask应用程序编写一个模糊器。我将示例请求存储为文本文件,例如get.txt:
GET /docs/index.html HTTP/1.1
Host: www.w3.org
理想情况下,我会将其解析为werkzeug.wrappers.Request
对象,类似这样(伪代码):
from werkzeug.wrappers import Request
req = Request()
with open('get.txt') as f:
req.parse_raw(f.read())
但是,看起来Werkzeug中没有发生原始HTTP解析。相反,Werkzeug从BaseHTTPServer.BaseHTTPRequestHandler获取WSGI环境,这需要BaseHTTPServer.HTTPServer实例来解析请求。对于这么简单的事情来说,这似乎有些过分。
我也遇到了http-parser,它更接近我想要的东西,但它复制了Werkzeug的大多数数据结构与不兼容的类型。我必须将数据从一个转换为另一个。
是否有更简单的方法可以从原始HTTP请求转到Werkzeug中的WSGI环境(或使用没有HTTP服务器的BaseHTTPRequestHandler)?
答案 0 :(得分:3)
没有找到一种简单的方法,所以我编写了一个名为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')])
在测试客户端上打开原始HTTP请求:
client = app.test_client()
rv = werkzeug_raw.open(client, 'GET /foo/bar?tequila=42 HTTP/1.1')