From 9b03a9c8ddd51db5e2ed2d02090e9b978ef34bf7 Mon Sep 17 00:00:00 2001 From: Antoine Romero-Romero Date: Wed, 8 Mar 2023 22:16:37 +0000 Subject: [PATCH] fix: changes after review --- integration_tests/base_routes.py | 27 ++++++++-------- integration_tests/views/async_view.py | 4 +-- integration_tests/views/sync_view.py | 4 +-- robyn/__init__.py | 4 +-- robyn/robyn.pyi | 2 -- src/server.rs | 10 +++--- src/types.rs | 46 +++++++++++++++++++-------- 7 files changed, 56 insertions(+), 41 deletions(-) diff --git a/integration_tests/base_routes.py b/integration_tests/base_routes.py index 370592b4a..c35d5d69d 100644 --- a/integration_tests/base_routes.py +++ b/integration_tests/base_routes.py @@ -1,8 +1,7 @@ import os import pathlib -from robyn import WS, Robyn, jsonify, serve_file, serve_html -from robyn.robyn import Request, Response +from robyn import WS, Robyn, Request, Response, jsonify, serve_file, serve_html from robyn.templating import JinjaTemplate from views import SyncView, AsyncView @@ -69,7 +68,7 @@ def sync_after_request(response: Response): new_headers = response.headers new_headers["after"] = "sync_after_request" response.headers = new_headers - response.set_body(response.body.as_str() + " after") + response.body = response.body + " after" return response @@ -93,7 +92,7 @@ async def async_after_request(response: Response): new_headers = response.headers new_headers["after"] = "async_after_request" response.headers = new_headers - response.set_body(response.body.as_str() + " after") + response.body = response.body + " after" return response @@ -404,12 +403,12 @@ async def async_dict_post(): @app.post("/sync/body") def sync_body_post(request: Request): - return request.body.as_str() + return request.body @app.post("/async/body") async def async_body_post(request: Request): - return request.body.as_str() + return request.body # --- PUT --- @@ -442,12 +441,12 @@ async def async_dict_put(): @app.put("/sync/body") def sync_body_put(request: Request): - return request.body.as_str() + return request.body @app.put("/async/body") async def async_body_put(request: Request): - return request.body.as_str() + return request.body # --- DELETE --- @@ -480,12 +479,12 @@ async def async_dict_delete(): @app.delete("/sync/body") def sync_body_delete(request: Request): - return request.body.as_str() + return request.body @app.delete("/async/body") async def async_body_delete(request: Request): - return request.body.as_str() + return request.body # --- PATCH --- @@ -518,12 +517,12 @@ async def async_dict_patch(): @app.patch("/sync/body") def sync_body_patch(request: Request): - return request.body.as_str() + return request.body @app.patch("/async/body") async def async_body_patch(request: Request): - return request.body.as_str() + return request.body # ===== Views ===== @@ -535,7 +534,7 @@ def get(): return "Hello, world!" def post(request: Request): - body = request.body.as_str() + body = request.body return {"status_code": 200, "body": body} @@ -545,7 +544,7 @@ async def get(): return "Hello, world!" async def post(request: Request): - body = request.body.as_str() + body = request.body return {"status_code": 200, "body": body} diff --git a/integration_tests/views/async_view.py b/integration_tests/views/async_view.py index baa82cdbc..b3e068c2f 100644 --- a/integration_tests/views/async_view.py +++ b/integration_tests/views/async_view.py @@ -1,4 +1,4 @@ -from robyn.robyn import Request +from robyn import Request def AsyncView(): @@ -6,7 +6,7 @@ async def get(): return "Hello, world!" async def post(request: Request): - body = request.body.as_str() + body = request.body return { "status": 200, "body": body, diff --git a/integration_tests/views/sync_view.py b/integration_tests/views/sync_view.py index 36f3f33d6..e6bfdbce1 100644 --- a/integration_tests/views/sync_view.py +++ b/integration_tests/views/sync_view.py @@ -1,4 +1,4 @@ -from robyn.robyn import Request +from robyn import Request def SyncView(): @@ -6,7 +6,7 @@ def get(): return "Hello, world!" def post(request: Request): - body = request.body.as_str() + body = request.body return { "status": 200, "body": body, diff --git a/robyn/__init__.py b/robyn/__init__.py index 0d5dd05d5..fd62a5022 100644 --- a/robyn/__init__.py +++ b/robyn/__init__.py @@ -15,7 +15,7 @@ from robyn.logger import Colors, logger from robyn.processpool import run_processes from robyn.responses import jsonify, serve_file, serve_html -from robyn.robyn import FunctionInfo, Response +from robyn.robyn import FunctionInfo, Request, Response from robyn.router import MiddlewareRouter, Router, WebSocketRouter from robyn.types import Directory, Header from robyn.status_codes import StatusCodes @@ -316,4 +316,4 @@ def inner(handler): return inner -__all__ = ["Robyn", "jsonify", "serve_file", "serve_html", "Response", "StatusCodes"] +__all__ = [Robyn, Request, Response, StatusCodes, jsonify, serve_file, serve_html] diff --git a/robyn/robyn.pyi b/robyn/robyn.pyi index c1073f406..128e5babe 100644 --- a/robyn/robyn.pyi +++ b/robyn/robyn.pyi @@ -19,8 +19,6 @@ class FunctionInfo: class Body: content: Union[str, bytes] - def as_str(self) -> str: - pass def as_bytes(self) -> bytes: pass def set(self, content: Union[str, bytes]): diff --git a/src/server.rs b/src/server.rs index 5229d4143..34a4b47a6 100644 --- a/src/server.rs +++ b/src/server.rs @@ -8,7 +8,7 @@ use crate::routers::http_router::HttpRouter; use crate::routers::types::MiddlewareRoute; use crate::routers::{middleware_router::MiddlewareRouter, web_socket_router::WebSocketRouter}; use crate::shared_socket::SocketHeld; -use crate::types::{FunctionInfo, Headers}; +use crate::types::FunctionInfo; use crate::web_socket_connection::start_web_socket; use std::convert::TryInto; @@ -336,8 +336,8 @@ async fn index( router: web::Data>, const_router: web::Data>, middleware_router: web::Data>, - global_request_headers: web::Data>, - global_response_headers: web::Data>, + global_request_headers: web::Data>>, + global_response_headers: web::Data>>, body: Bytes, req: HttpRequest, ) -> impl Responder { @@ -358,8 +358,8 @@ async fn index( }; // Route execution - let mut response = if let Some(r) = const_router.get_route(req.method(), req.uri().path()) { - r + let mut response = if let Some(res) = const_router.get_route(req.method(), req.uri().path()) { + res } else if let Some((function, route_params)) = router.get_route(req.method(), req.uri().path()) { request.params = route_params; diff --git a/src/types.rs b/src/types.rs index 2215865be..bddd75b80 100644 --- a/src/types.rs +++ b/src/types.rs @@ -33,10 +33,6 @@ pub struct ActixBytesWrapper { #[pymethods] impl ActixBytesWrapper { - pub fn as_str(&self) -> PyResult { - Ok(String::from_utf8(self.content.to_vec())?) - } - pub fn as_bytes(&self) -> PyResult> { Ok(self.content.to_vec()) } @@ -48,7 +44,7 @@ impl ActixBytesWrapper { v.as_bytes().to_vec() } else { return Err(PyValueError::new_err(format!( - "Could not convert {} specified body to bytes", + "Could not convert body of type {} to bytes", type_of(content) ))); }; @@ -155,10 +151,26 @@ pub struct Request { pub method: Method, #[pyo3(get, set)] pub params: HashMap, - #[pyo3(get, set)] pub body: ActixBytesWrapper, } +#[pymethods] +impl Request { + #[getter] + pub fn get_body(&self) -> PyResult { + Ok(String::from_utf8(self.body.to_vec())?) + } + + #[setter] + pub fn set_body(&mut self, content: &PyAny) -> PyResult<()> { + self.body.set(content) + } + + pub fn get_body_as_bytes(&self) -> PyResult> { + self.body.as_bytes() + } +} + impl Request { pub fn from_actix_request( req: &HttpRequest, @@ -173,7 +185,7 @@ impl Request { queries.insert(params.0.to_string(), params.1.to_string()); } } - let request_headers = req + let headers = req .headers() .iter() .map(|(k, v)| (k.to_string(), v.to_str().unwrap().to_string())) @@ -186,7 +198,7 @@ impl Request { Self { queries, - headers: request_headers, + headers, method: req.method().clone(), params: HashMap::new(), body: ActixBytesWrapper { content: body }, @@ -201,7 +213,6 @@ pub struct Response { pub response_type: String, #[pyo3(get, set)] pub headers: HashMap, - #[pyo3(get)] pub body: ActixBytesWrapper, pub file_path: Option, } @@ -254,9 +265,18 @@ impl Response { }) } - pub fn set_body(&mut self, body: &PyAny) -> PyResult<()> { - self.body = ActixBytesWrapper::new(body)?; - Ok(()) + #[getter] + pub fn get_body(&self) -> PyResult { + Ok(String::from_utf8(self.body.to_vec())?) + } + + #[setter] + pub fn set_body(&mut self, content: &PyAny) -> PyResult<()> { + self.body.set(content) + } + + pub fn get_body_as_bytes(&self) -> PyResult> { + self.body.as_bytes() } pub fn set_file_path(&mut self, file_path: &str) -> PyResult<()> { @@ -272,5 +292,3 @@ impl Response { Ok(()) } } - -pub type Headers = DashMap;