]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Factored out body argument-parsing code into httputil.parse_body_arguments 530/head
authorAlek Storm <alek.storm@gmail.com>
Thu, 7 Jun 2012 20:59:05 +0000 (16:59 -0400)
committerAlek Storm <alek.storm@gmail.com>
Thu, 7 Jun 2012 20:59:05 +0000 (16:59 -0400)
Parses application/x-www-form-urlencoded or multipart/form data)

Was duplicated in httpserver and wsgi

tornado/httpserver.py
tornado/httputil.py
tornado/wsgi.py

index 5667ba1567724eada780a6018102a3b010a9b819..952a6a26815485fb0539d16f1548668d775ec08a 100644 (file)
@@ -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)
 
 
index 6201dd188ffbf29dc26e347b122577a2640f1733..6f5d07a689b3ccbaf21c118beedb081367fd0ed5 100644 (file)
@@ -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.
 
index e0b11d330e595cddf028604d540a3eba60042078..653596c536d6a76061b66a86bb98597d7793078f 100644 (file)
@@ -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