Start fleshing out the request
authorDavid Kerkeslager <kerkeslager@gmail.com>
Wed, 23 Oct 2019 02:44:36 +0000 (22:44 -0400)
committerDavid Kerkeslager <kerkeslager@gmail.com>
Wed, 23 Oct 2019 02:44:43 +0000 (22:44 -0400)
phial.py
test_phial.py

index bc07b5f..5388c05 100644 (file)
--- a/phial.py
+++ b/phial.py
@@ -1,13 +1,67 @@
 import collections
 import json
+import urllib.parse
 
-Request = collections.namedtuple(
+_Request = collections.namedtuple(
     'Request',
     (
-        'environ',
+        'env',
+        'GET',
+        'accept',
+        'accept_encoding',
+        'accept_language',
+        'content',
+        'content_length',
+        'content_type',
+        'cookies',
+        'method',
+        'path',
+        'parameters',
+        'query',
+        'user_agent',
     )
 )
 
+class Request(_Request):
+    def __new__(cls, env):
+        accept = env.get('HTTP_ACCEPT')
+        accept_encoding = env.get('HTTP_ACCEPT_ENCODING')
+        accept_language = env.get('HTTP_ACCEPT_LANGUAGE')
+        content = env.get('CONTENT', '')
+        content_length = env.get('CONTENT_LENGTH')
+        content_type = env.get('CONTENT_TYPE')
+        cookies = env.get('HTTP_COOKIE')
+        method = env.get('REQUEST_METHOD')
+        path = env.get('PATH_INFO')
+        query = env.get('QUERY_STRING')
+        user_agent = env.get('HTTP_USER_AGENT')
+
+        GET = urllib.parse.parse_qs(query)
+
+        if method == 'GET':
+            parameters = GET
+
+        result = super().__new__(
+            cls,
+            env=env,
+            GET=GET,
+            accept=accept,
+            accept_encoding=accept_encoding,
+            accept_language=accept_language,
+            content = content,
+            content_length = content_length,
+            content_type = content_type,
+            cookies=cookies,
+            method=method,
+            parameters=parameters,
+            path=path,
+            query=query,
+            user_agent=user_agent,
+        )
+
+        result.subpath = path
+        return result
+
 _Response = collections.namedtuple(
     'Response',
     (
@@ -137,8 +191,8 @@ def _get_content(response):
     return content
 
 def App(handler):
-    def app(environ, start_fn):
-        response = handler(Request(environ))
+    def app(env, start_fn):
+        response = handler(Request(env))
 
         start_fn(_get_status(response), _get_headers(response))
         return _get_content(response)
index 8d7498d..672be96 100644 (file)
@@ -3,6 +3,25 @@ from unittest import mock
 
 import phial
 
+class RequestTests(unittest.TestCase):
+    def test_GET(self):
+        request = phial.Request({
+            'REQUEST_METHOD': 'GET',
+            'QUERY_STRING': 'foo=bar&baz=qux',
+        })
+
+        self.assertEqual(request.GET['foo'], ['bar'])
+        self.assertEqual(request.GET['baz'], ['qux'])
+
+    def test_parameters(self):
+        request = phial.Request({
+            'REQUEST_METHOD': 'GET',
+            'QUERY_STRING': 'foo=bar&baz=qux',
+        })
+
+        self.assertEqual(request.parameters['foo'], ['bar'])
+        self.assertEqual(request.parameters['baz'], ['qux'])
+
 class ResponseTests(unittest.TestCase):
     def test_content_can_be_positional_argument(self):
         response = phial.Response('Hello, world\n', content_type='text/plain')