@@ -5,7 +5,7 @@ from lightbug_http._logger import logger
55from lightbug_http.connection import NoTLSListener, default_buffer_size, TCPConnection, ListenConfig
66from lightbug_http.socket import Socket
77from lightbug_http.http import HTTPRequest, encode
8- from lightbug_http.http.common_response import InternalError, BadRequest
8+ from lightbug_http.http.common_response import InternalError, BadRequest, URITooLong
99from lightbug_http.uri import URI
1010from lightbug_http.header import Headers
1111from lightbug_http.service import HTTPService
@@ -14,6 +14,7 @@ from lightbug_http.error import ErrorHandler
1414
1515alias DefaultConcurrency : Int = 256 * 1024
1616alias default_max_request_body_size = 4 * 1024 * 1024 # 4MB
17+ alias default_max_request_uri_length = 8192
1718
1819
1920struct Server (Movable ):
@@ -27,6 +28,7 @@ struct Server(Movable):
2728 var max_requests_per_connection : UInt
2829
2930 var _max_request_body_size : UInt
31+ var _max_request_uri_length : UInt
3032 var tcp_keep_alive : Bool
3133
3234 fn __init__ (
@@ -37,13 +39,15 @@ struct Server(Movable):
3739 max_concurrent_connections : UInt = 1000 ,
3840 max_requests_per_connection : UInt = 0 ,
3941 max_request_body_size : UInt = default_max_request_body_size,
42+ max_request_uri_length : UInt = default_max_request_uri_length,
4043 tcp_keep_alive : Bool = False ,
4144 ) raises :
4245 self .error_handler = error_handler
4346 self .name = name
4447 self ._address = address
4548 self .max_requests_per_connection = max_requests_per_connection
46- self ._max_request_body_size = default_max_request_body_size
49+ self ._max_request_body_size = max_request_body_size
50+ self ._max_request_uri_length = max_request_uri_length
4751 self .tcp_keep_alive = tcp_keep_alive
4852 if max_concurrent_connections == 0 :
4953 self .max_concurrent_connections = DefaultConcurrency
@@ -57,6 +61,7 @@ struct Server(Movable):
5761 self .max_concurrent_connections = other.max_concurrent_connections
5862 self .max_requests_per_connection = other.max_requests_per_connection
5963 self ._max_request_body_size = other._max_request_body_size
64+ self ._max_request_uri_length = other._max_request_uri_length
6065 self .tcp_keep_alive = other.tcp_keep_alive
6166
6267 fn address (self ) -> ref [self ._address] String:
@@ -71,6 +76,12 @@ struct Server(Movable):
7176 fn set_max_request_body_size (mut self , size : UInt) -> None :
7277 self ._max_request_body_size = size
7378
79+ fn max_request_uri_length (self ) -> UInt:
80+ return self ._max_request_uri_length
81+
82+ fn set_max_request_uri_length (mut self , length : UInt) -> None :
83+ self ._max_request_uri_length = length
84+
7485 fn get_concurrency (self ) -> UInt:
7586 """ Retrieve the concurrency level which is either
7687 the configured `max_concurrent_connections` or the `DefaultConcurrency`.
@@ -128,6 +139,10 @@ struct Server(Movable):
128139 var max_request_body_size = self .max_request_body_size()
129140 if max_request_body_size <= 0 :
130141 max_request_body_size = default_max_request_body_size
142+
143+ var max_request_uri_length = self .max_request_uri_length()
144+ if max_request_uri_length <= 0 :
145+ max_request_uri_length = default_max_request_uri_length
131146
132147 var req_number = 0
133148 while True :
@@ -163,7 +178,7 @@ struct Server(Movable):
163178
164179 var request : HTTPRequest
165180 try :
166- request = HTTPRequest.from_bytes(self .address(), max_request_body_size, request_buffer)
181+ request = HTTPRequest.from_bytes(self .address(), max_request_body_size, max_request_uri_length, request_buffer)
167182 var response : HTTPResponse
168183 var close_connection = (not self .tcp_keep_alive) or request.connection_close()
169184 try :
@@ -200,7 +215,10 @@ struct Server(Movable):
200215 except e:
201216 logger.error(" Failed to parse HTTPRequest:" , String(e))
202217 try :
203- _ = conn.write(encode(BadRequest()))
218+ if String(e) == " HTTPRequest.from_bytes: Request URI too long" :
219+ _ = conn.write(encode(URITooLong()))
220+ else :
221+ _ = conn.write(encode(BadRequest()))
204222 except e:
205223 logger.error(" Failed to write BadRequest response to the connection:" , String(e))
206224 conn.teardown()
0 commit comments