簡體   English   中英

使用Werkzeug解析原始HTTP請求

[英]Parse raw HTTP request with Werkzeug

我正在為Flask應用程序編寫一個模糊器。 我將示例請求存儲為文本文件,例如get.txt:

GET /docs/index.html HTTP/1.1
Host: www.w3.org

理想情況下,我werkzeug.wrappers.Request解析為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)?

沒有找到一個簡單的方法,所以我編寫了一個名為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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM