From bc99c93b5b114b45f01627b7fdf7e174bd0ed597 Mon Sep 17 00:00:00 2001 From: Val Date: Sat, 25 May 2024 17:43:44 +0200 Subject: [PATCH] pass uri directly --- lightbug_http/header.mojo | 2 +- lightbug_http/sys/server.mojo | 37 +++++++++++++++++++++++++++-------- lightbug_http/uri.mojo | 3 +-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/lightbug_http/header.mojo b/lightbug_http/header.mojo index e97d08f2..a4e037a6 100644 --- a/lightbug_http/header.mojo +++ b/lightbug_http/header.mojo @@ -239,7 +239,7 @@ struct RequestHeader: if proto != strHttp11: proto_str = proto - var request_uri = rest_of_request_line[:n] + var request_uri = rest_of_request_line[:n + 1] _ = self.set_method(method) _ = self.set_protocol(proto_str) diff --git a/lightbug_http/sys/server.mojo b/lightbug_http/sys/server.mojo index f9c06849..b43da7dc 100644 --- a/lightbug_http/sys/server.mojo +++ b/lightbug_http/sys/server.mojo @@ -10,7 +10,7 @@ from lightbug_http.io.bytes import Bytes from lightbug_http.error import ErrorHandler from lightbug_http.strings import next_line, NetworkType - +@value struct SysServer: """ A Mojo-based server that accept incoming requests and delivers HTTP services. @@ -19,6 +19,7 @@ struct SysServer: var error_handler: ErrorHandler var name: String + var __address: String var max_concurrent_connections: Int var max_requests_per_connection: Int @@ -30,6 +31,17 @@ struct SysServer: fn __init__(inout self) raises: self.error_handler = ErrorHandler() self.name = "lightbug_http" + self.__address = "127.0.0.1" + self.max_concurrent_connections = 1000 + self.max_requests_per_connection = 0 + self.max_request_body_size = 0 + self.tcp_keep_alive = False + self.ln = SysListener() + + fn __init__(inout self, own_address: String) raises: + self.error_handler = ErrorHandler() + self.name = "lightbug_http" + self.__address = own_address self.max_concurrent_connections = 1000 self.max_requests_per_connection = 0 self.max_request_body_size = 0 @@ -39,11 +51,19 @@ struct SysServer: fn __init__(inout self, error_handler: ErrorHandler) raises: self.error_handler = error_handler self.name = "lightbug_http" + self.__address = "127.0.0.1" self.max_concurrent_connections = 1000 self.max_requests_per_connection = 0 self.max_request_body_size = 0 self.tcp_keep_alive = False self.ln = SysListener() + + fn address(self) -> String: + return self.__address + + fn set_address(inout self, own_address: String) -> Self: + self.__address = own_address + return self fn get_concurrency(self) -> Int: """ @@ -70,6 +90,7 @@ struct SysServer: """ var __net = SysNet() var listener = __net.listen(NetworkType.tcp4.value, address) + _ = self.set_address(address) self.serve(listener, handler) fn serve[T: HTTPService](inout self, ln: SysListener, handler: T) raises -> None: @@ -98,13 +119,6 @@ struct SysServer: var headers_and_body = next_line(request.rest, "\n\n") var request_headers = headers_and_body.first_line var request_body = headers_and_body.rest - var uri = URI(request.first_line) - try: - uri.parse() - except e: - conn.close() - raise Error("Failed to parse request line:" + e.__str__()) - var header = RequestHeader(request_headers._buffer) try: header.parse(request.first_line) @@ -112,6 +126,13 @@ struct SysServer: conn.close() raise Error("Failed to parse request header: " + e.__str__()) + var uri = URI(self.address() + String(header.request_uri())) + try: + uri.parse() + except e: + conn.close() + raise Error("Failed to parse request line:" + e.__str__()) + if header.content_length() != 0 and header.content_length() != (len(request_body) + 1): var remaining_body = Bytes() var remaining_len = header.content_length() - len(request_body + 1) diff --git a/lightbug_http/uri.mojo b/lightbug_http/uri.mojo index 66913be2..5430f46d 100644 --- a/lightbug_http/uri.mojo +++ b/lightbug_http/uri.mojo @@ -197,8 +197,7 @@ struct URI: is_https = True remainder_uri = raw_uri[proto_end + 3:] else: - raise Error("Invalid URI: Missing protocol") - + remainder_uri = raw_uri # Parse the host and optional port var path_start = remainder_uri.find("/") var host_and_port: String