From: Alek Storm Date: Thu, 7 Jun 2012 20:59:05 +0000 (-0400) Subject: Factored out body argument-parsing code into httputil.parse_body_arguments X-Git-Tag: v2.4.0~53^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b4e890513334084ea7091e460eabc5cc66cf512;p=thirdparty%2Ftornado.git Factored out body argument-parsing code into httputil.parse_body_arguments Parses application/x-www-form-urlencoded or multipart/form data) Was duplicated in httpserver and wsgi --- diff --git a/tornado/httpserver.py b/tornado/httpserver.py index 5667ba156..952a6a268 100644 --- a/tornado/httpserver.py +++ b/tornado/httpserver.py @@ -31,7 +31,7 @@ import logging import socket import time -from tornado.escape import utf8, native_str, parse_qs_bytes +from tornado.escape import native_str, parse_qs_bytes from tornado import httputil from tornado import iostream from tornado.netutil import TCPServer @@ -268,27 +268,10 @@ class HTTPConnection(object): def _on_request_body(self, data): self._request.body = data - content_type = self._request.headers.get("Content-Type", "") if self._request.method in ("POST", "PATCH", "PUT"): - if content_type.startswith("application/x-www-form-urlencoded"): - arguments = parse_qs_bytes(native_str(self._request.body)) - for name, values in arguments.iteritems(): - values = [v for v in values if v] - if values: - self._request.arguments.setdefault(name, []).extend( - values) - elif content_type.startswith("multipart/form-data"): - fields = content_type.split(";") - for field in fields: - k, sep, v = field.strip().partition("=") - if k == "boundary" and v: - httputil.parse_multipart_form_data( - utf8(v), data, - self._request.arguments, - self._request.files) - break - else: - logging.warning("Invalid multipart/form-data") + httputil.parse_body_arguments( + self._request.headers.get("Content-Type", ""), data, + self._request.arguments, self._request.files) self.request_callback(self._request) diff --git a/tornado/httputil.py b/tornado/httputil.py index 6201dd188..6f5d07a68 100644 --- a/tornado/httputil.py +++ b/tornado/httputil.py @@ -22,6 +22,7 @@ import logging import urllib import re +from tornado.escape import native_str, parse_qs_bytes, utf8 from tornado.util import b, ObjectDict @@ -205,6 +206,24 @@ class HTTPFile(ObjectDict): pass +def parse_body_arguments(content_type, body, arguments, files): + if content_type.startswith("application/x-www-form-urlencoded"): + uri_arguments = parse_qs_bytes(native_str(body)) + for name, values in uri_arguments.iteritems(): + values = [v for v in values if v] + if values: + arguments.setdefault(name, []).extend(values) + elif content_type.startswith("multipart/form-data"): + fields = content_type.split(";") + for field in fields: + k, sep, v = field.strip().partition("=") + if k == "boundary" and v: + parse_multipart_form_data(utf8(v), body, arguments, files) + break + else: + logging.warning("Invalid multipart/form-data") + + def parse_multipart_form_data(boundary, data, arguments, files): """Parses a multipart/form-data body. diff --git a/tornado/wsgi.py b/tornado/wsgi.py index e0b11d330..653596c53 100644 --- a/tornado/wsgi.py +++ b/tornado/wsgi.py @@ -143,18 +143,8 @@ class HTTPRequest(object): # Parse request body self.files = {} - content_type = self.headers.get("Content-Type", "") - if content_type.startswith("application/x-www-form-urlencoded"): - for name, values in parse_qs_bytes(native_str(self.body)).iteritems(): - self.arguments.setdefault(name, []).extend(values) - elif content_type.startswith("multipart/form-data"): - if 'boundary=' in content_type: - boundary = content_type.split('boundary=', 1)[1] - if boundary: - httputil.parse_multipart_form_data( - utf8(boundary), self.body, self.arguments, self.files) - else: - logging.warning("Invalid multipart/form-data") + httputil.parse_body_arguments(self.headers.get("Content-Type", ""), + self.body, self.arguments, self.files) self._start_time = time.time() self._finish_time = None