From d589d8b9f1597b37214f6ef2ea810e6d62b7ecff Mon Sep 17 00:00:00 2001 From: Ciro Date: Wed, 16 Nov 2022 09:20:27 -0300 Subject: [PATCH] add preserve to clone info in AppRequest --- examples/graphiql.py | 3 +-- examples/graphiql_raw.py | 8 ++------ src/socketify/helpers.py | 9 ++------- src/socketify/socketify.py | 27 ++++++++++++++++++++++++--- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/examples/graphiql.py b/examples/graphiql.py index 51f0514..2ce64d0 100644 --- a/examples/graphiql.py +++ b/examples/graphiql.py @@ -15,8 +15,7 @@ class User: class Query: @strawberry.field def user(self) -> Optional[User]: - # self.context is an dict with headers, query, and params properties - # headers and query are dict and params an array with route parameters + # self.context is the AppRequest return User(name="Hello") diff --git a/examples/graphiql_raw.py b/examples/graphiql_raw.py index 5beea10..cbb630d 100644 --- a/examples/graphiql_raw.py +++ b/examples/graphiql_raw.py @@ -22,12 +22,8 @@ schema = strawberry.Schema(Query) async def graphiql_post(res, req): # we can pass whatever we want to context, query, headers or params, cookies etc - context_value = { - "query": req.get_queries(), - "headers": req.get_headers(), - "params": req.get_parameters() - } - + context_value = req.preserve() + # get all incomming data and parses as json body = await res.get_json() diff --git a/src/socketify/helpers.py b/src/socketify/helpers.py index 9e9c240..7003b24 100644 --- a/src/socketify/helpers.py +++ b/src/socketify/helpers.py @@ -118,13 +118,8 @@ def middleware(*functions): if inspect.iscoroutinefunction(function): #in async query string, arguments and headers are only valid until the first await if not some_async_as_run: - #get_headers will preserve headers (and cookies) inside req, after await - headers = req.get_headers() - #get_parameters will preserve all params inside req after await - params = req.get_parameters() - #get queries will preserve all queries inside req after await - queries = req.get_queries() - #mark to only grab header, params and queries one time + #preserve queries, headers, parameters, url, full_url and method + req.preserve() some_async_as_run = True data = await function(res, req, data) else: diff --git a/src/socketify/socketify.py b/src/socketify/socketify.py index b6e0f5d..c0c66ff 100644 --- a/src/socketify/socketify.py +++ b/src/socketify/socketify.py @@ -867,6 +867,9 @@ class AppRequest: self._headers = None self._params = None self._query = None + self._url = None + self._full_url = None + self._method = None def get_cookie(self, name): @@ -891,28 +894,37 @@ class AppRequest: return None def get_url(self): + if self._url: + return self._url buffer = ffi.new("char**") length = lib.uws_req_get_url(self.req, buffer) buffer_address = ffi.addressof(buffer, 0)[0] if buffer_address == ffi.NULL: return None try: - return ffi.unpack(buffer_address, length).decode("utf-8") + self._url = ffi.unpack(buffer_address, length).decode("utf-8") + return self._url except Exception: #invalid utf-8 return None + def get_full_url(self): + if self._full_url: + return self._full_url buffer = ffi.new("char**") length = lib.uws_req_get_full_url(self.req, buffer) buffer_address = ffi.addressof(buffer, 0)[0] if buffer_address == ffi.NULL: return None try: - return ffi.unpack(buffer_address, length).decode("utf-8") + self._full_url = ffi.unpack(buffer_address, length).decode("utf-8") + return self._full_url except Exception: #invalid utf-8 return None def get_method(self): + if self._method: + return self._method buffer = ffi.new("char**") #will use uws_req_get_case_sensitive_method until version v21 and switch back to uws_req_get_method for 0 impacts on behavior length = lib.uws_req_get_case_sensitive_method(self.req, buffer) @@ -921,7 +933,8 @@ class AppRequest: return None try: - return ffi.unpack(buffer_address, length).decode("utf-8") + self._method = ffi.unpack(buffer_address, length).decode("utf-8") + return self._method except Exception: #invalid utf-8 return None @@ -1023,6 +1036,14 @@ class AppRequest: return ffi.unpack(buffer_address, length).decode("utf-8") except Exception: #invalid utf-8 return None + def preserve(self): + #preserve queries, headers, parameters, method, url and full url + self.get_queries() #queries calls url and full_url so its preserved + self.get_headers() + self.get_parameters() + self.get_method() + return self + def set_yield(self, has_yield): lib.uws_req_set_field(self.req, 1 if has_yield else 0) def get_yield(self):