Повторное использование стандартного библиотечного кода Python для этой цели немного сложнее (он не был предназначен для повторного использования таким образом! -), но должно быть выполнимо, например:
import cStringIO
from wsgiref import simple_server, util
input_string = """POST /mum/ble?q=huh HTTP/1.0
Content-Length: 18
Content-Type: application/json; charset="utf-8"
Host: localhost:80
["do", "re", "mi"]
"""
class FakeHandler(simple_server.WSGIRequestHandler):
def __init__(self, rfile):
self.rfile = rfile
self.wfile = cStringIO.StringIO() # for error msgs
self.server = self
self.base_environ = {}
self.client_address = ['?', 80]
self.raw_requestline = self.rfile.readline()
self.parse_request()
def getenv(self):
env = self.get_environ()
util.setup_testing_defaults(env)
env['wsgi.input'] = self.rfile
return env
handler = FakeHandler(rfile=cStringIO.StringIO(input_string))
wsgi_env = handler.getenv()
print wsgi_env
По сути, нам нужно создать подкласс обработчика запросов, чтобы подделать процесс построения, который обычно выполняется для него сервером (rfile
и wfile
, построенные из сокета для клиента и т. Д.) Я думаю, это не совсем завершено, но должно быть близко, и я надеюсь, что это окажется полезным!
Обратите внимание, что я также исправил ваш пример HTTP-запроса: без HTTP/1.0
или 1.1 в конце строки необработанного запроса POST
считается некорректным и вызывает исключение и получающееся сообщение об ошибке на handler.wfile
.