Index: sitescripts/web.py |
=================================================================== |
--- a/sitescripts/web.py |
+++ b/sitescripts/web.py |
@@ -19,6 +19,8 @@ |
import imp |
import importlib |
import re |
+from urlparse import parse_qsl |
+ |
from sitescripts.utils import get_config |
handlers = {} |
@@ -59,6 +61,35 @@ |
[("WWW-Authenticate", 'Basic realm="%s"' % realm)]) |
return "" |
+def send_status_response(status, start_response): |
+ start_response(status, [('Content-Type', 'text/plain')]) |
+ return [status] |
+ |
+def form_handler(func): |
+ def wrapper(environ, start_response): |
+ if environ['REQUEST_METHOD'] != 'POST': |
+ return send_status_response('405 Method Not Allowed', start_response) |
+ |
+ if not environ.get('CONTENT_TYPE', '').startswith('application/x-www-form-urlencoded'): |
+ return send_status_response('415 Unsupported Media Type', start_response) |
+ |
+ try: |
+ content_length = int(environ['CONTENT_LENGTH']) |
+ except (KeyError, ValueError): |
+ content_length = None |
+ if content_length is None or content_length < 0: |
+ return send_status_response('411 Length Required', start_response) |
+ |
+ raw_data = parse_qsl(environ['wsgi.input'].read(content_length)) |
+ try: |
+ data = {k.decode('utf-8'): v.decode('utf-8') for k, v in raw_data} |
+ except UnicodeDecodeError: |
+ return send_status_response('400 Invalid character in form data', start_response) |
+ |
+ return func(environ, start_response, data) |
+ |
+ return wrapper |
+ |
def multiplex(environ, start_response): |
try: |
path = environ["PATH_INFO"] |