【问题标题】:Parse raw HTTP request with Werkzeug使用 Werkzeug 解析原始 HTTP 请求
【发布时间】:2015-10-20 21:46:55
【问题描述】:

我正在为 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 的大多数数据结构,类型不兼容。我必须将数据从一个转换到另一个。

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

【问题讨论】:

    标签: python flask werkzeug


    【解决方案1】:

    没有找到简单的方法来做到这一点,所以我编写了一个名为 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')
    

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多