使用Werkzeug解析原始HTTP请求

时间:2015-10-20 21:46:56

标签: python flask werkzeug

我正在为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)?

1 个答案:

答案 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')