首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Werkzeug解析原始HTTP请求

使用Werkzeug解析原始HTTP请求
EN

Stack Overflow用户
提问于 2015-10-21 05:46:56
回答 1查看 883关注 0票数 5

我正在为Flask应用程序编写一个fuzzer。我将示例请求存储为文本文件,如下面的get.txt:

代码语言:javascript
复制
GET /docs/index.html HTTP/1.1
Host: www.w3.org

理想情况下,我会将其解析为一个werkzeug.wrappers.Request对象,类似于(psuedo-code):

代码语言:javascript
复制
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环境(或者使用BaseHTTPRequestHandler而不使用HTTP服务器)?

EN

回答 1

Stack Overflow用户

发布于 2015-10-22 07:35:03

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

它是这样工作的:

代码语言:javascript
复制
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请求,请执行以下操作:

代码语言:javascript
复制
client = app.test_client()
rv = werkzeug_raw.open(client, 'GET /foo/bar?tequila=42 HTTP/1.1')
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33247381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档