85
85
)
86
86
from werkzeug .exceptions import BadRequest , NotFound
87
87
88
- from localstack .aws .api import HttpRequest
89
88
from localstack .aws .protocol .op_router import RestServiceOperationRouter
90
89
from localstack .config import LEGACY_V2_S3_PROVIDER
90
+ from localstack .http import Request
91
91
92
92
93
93
def _text_content (func ):
@@ -104,7 +104,7 @@ def _text_content(func):
104
104
105
105
def _get_text_content (
106
106
self ,
107
- request : HttpRequest ,
107
+ request : Request ,
108
108
shape : Shape ,
109
109
node_or_string : Union [ETree .Element , str ],
110
110
uri_params : Mapping [str , Any ] = None ,
@@ -202,7 +202,7 @@ def __init__(self, service: ServiceModel) -> None:
202
202
self .service = service
203
203
204
204
@_handle_exceptions
205
- def parse (self , request : HttpRequest ) -> Tuple [OperationModel , Any ]:
205
+ def parse (self , request : Request ) -> Tuple [OperationModel , Any ]:
206
206
"""
207
207
Determines which operation the request was aiming for and parses the incoming request such that the resulting
208
208
dictionary can be used to invoke the service's function implementation.
@@ -215,12 +215,12 @@ def parse(self, request: HttpRequest) -> Tuple[OperationModel, Any]:
215
215
raise NotImplementedError
216
216
217
217
def _parse_shape (
218
- self , request : HttpRequest , shape : Shape , node : Any , uri_params : Mapping [str , Any ] = None
218
+ self , request : Request , shape : Shape , node : Any , uri_params : Mapping [str , Any ] = None
219
219
) -> Any :
220
220
"""
221
221
Main parsing method which dynamically calls the parsing function for the specific shape.
222
222
223
- :param request: the complete HttpRequest
223
+ :param request: the complete Request
224
224
:param shape: of the node
225
225
:param node: the single part of the HTTP request to parse
226
226
:param uri_params: the extracted URI path params
@@ -273,7 +273,7 @@ def _parse_shape(
273
273
274
274
def _parse_list (
275
275
self ,
276
- request : HttpRequest ,
276
+ request : Request ,
277
277
shape : ListShape ,
278
278
node : list ,
279
279
uri_params : Mapping [str , Any ] = None ,
@@ -362,7 +362,7 @@ class QueryRequestParser(RequestParser):
362
362
"""
363
363
364
364
@_handle_exceptions
365
- def parse (self , request : HttpRequest ) -> Tuple [OperationModel , Any ]:
365
+ def parse (self , request : Request ) -> Tuple [OperationModel , Any ]:
366
366
instance = request .values
367
367
if "Action" not in instance :
368
368
raise ProtocolParserError (
@@ -387,7 +387,7 @@ def parse(self, request: HttpRequest) -> Tuple[OperationModel, Any]:
387
387
388
388
def _process_member (
389
389
self ,
390
- request : HttpRequest ,
390
+ request : Request ,
391
391
member_name : str ,
392
392
member_shape : Shape ,
393
393
node : dict ,
@@ -409,7 +409,7 @@ def _process_member(
409
409
410
410
def _parse_structure (
411
411
self ,
412
- request : HttpRequest ,
412
+ request : Request ,
413
413
shape : StructureShape ,
414
414
node : dict ,
415
415
uri_params : Mapping [str , Any ] = None ,
@@ -431,7 +431,7 @@ def _parse_structure(
431
431
return result if len (result ) > 0 else None
432
432
433
433
def _parse_map (
434
- self , request : HttpRequest , shape : MapShape , node : dict , uri_params : Mapping [str , Any ]
434
+ self , request : Request , shape : MapShape , node : dict , uri_params : Mapping [str , Any ]
435
435
) -> dict :
436
436
"""
437
437
This is what the node looks like for a flattened map::
@@ -479,7 +4
EF5E
79,7 @@ def _parse_map(
479
479
480
480
def _parse_list (
481
481
self ,
482
- request : HttpRequest ,
482
+ request : Request ,
483
483
shape : ListShape ,
484
484
node : dict ,
485
485
uri_params : Mapping [str , Any ] = None ,
@@ -554,7 +554,7 @@ def __init__(self, service: ServiceModel) -> None:
554
554
self ._operation_router = RestServiceOperationRouter (service )
555
555
556
556
@_handle_exceptions
557
- def parse (self , request : HttpRequest ) -> Tuple [OperationModel , Any ]:
557
+ def parse (self , request : Request ) -> Tuple [OperationModel , Any ]:
558
558
try :
559
559
operation , uri_params = self ._operation_router .match (request )
560
560
except NotFound as e :
@@ -571,7 +571,7 @@ def parse(self, request: HttpRequest) -> Tuple[OperationModel, Any]:
571
571
572
572
def _parse_payload (
573
573
self ,
574
- request : HttpRequest ,
574
+ request : Request ,
575
575
shape : Shape ,
576
576
member_shapes : Dict [str , Shape ],
577
577
uri_params : Mapping [str , Any ],
@@ -622,7 +622,7 @@ def _parse_payload(
622
622
final_parsed .update (non_payload_parsed )
623
623
final_parsed .update (payload_parsed )
624
624
625
- def _initial_body_parse (self , request : HttpRequest ) -> Any :
625
+ def _initial_body_parse (self , request : Request ) -> Any :
626
626
"""
627
627
This method executes the initial parsing of the body (XML, JSON, or CBOR).
628
628
The parsed body will afterwards still be walked through and the nodes will be converted to the appropriate
@@ -633,13 +633,13 @@ def _initial_body_parse(self, request: HttpRequest) -> Any:
633
633
"""
634
634
raise NotImplementedError ("_initial_body_parse" )
635
635
636
- def _create_event_stream (self , request : HttpRequest , shape : Shape ) -> Any :
636
+ def _create_event_stream (self , request : Request , shape : Shape ) -> Any :
637
637
# TODO handle event streams
638
638
raise NotImplementedError ("_create_event_stream" )
639
639
640
- def create_input_stream (self , request : HttpRequest ) -> IO [bytes ]:
640
+ def create_input_stream (self , request : Request ) -> IO [bytes ]:
641
641
"""
642
- Returns an IO object that makes the payload of the HttpRequest available for streaming.
642
+ Returns an IO object that makes the payload of the Request available for streaming.
643
643
644
644
:param request: the http request
645
645
:return: the input stream that allows services to consume the request payload
@@ -661,15 +661,15 @@ def __init__(self, service_model: ServiceModel):
661
661
self .ignore_get_body_errors = True
662
662
self ._namespace_re = re .compile ("{.*}" )
663
663
664
- def _initial_body_parse (self , request : HttpRequest ) -> ETree .Element :
664
+ def _initial_body_parse (self , request : Request ) -> ETree .Element :
665
665
body = request .data
666
666
if not body :
667
667
return ETree .Element ("" )
668
668
return self ._parse_xml_string_to_dom (body )
669
669
670
670
def _parse_structure (
671
671
self ,
672
- request : HttpRequest ,
672
+ request : Request ,
673
673
shape : StructureShape ,
674
674
node : ETree .Element ,
675
675
uri_params : Mapping [str , Any ] = None ,
@@ -704,7 +704,7 @@ def _parse_structure(
704
704
705
705
def _parse_map (
706
706
self ,
707
- request : HttpRequest ,
707
+ request : Request ,
708
708
shape : MapShape ,
709
709
node : dict ,
710
710
uri_params : Mapping [str , Any ] = None ,
@@ -732,7 +732,7 @@ def _parse_map(
732
732
733
733
def _parse_list (
734
734
self ,
735
- request : HttpRequest ,
735
+ request : Request ,
736
736
shape : ListShape ,
737
737
node : dict ,
738
738
uri_params : Mapping [str , Any ] = None ,
@@ -799,7 +799,7 @@ def _build_name_to_xml_node(self, parent_node: Union[list, ETree.Element]) -> di
799
799
xml_dict [key ] = item
800
800
return xml_dict
801
801
802
- def _create_event_stream (self , request : HttpRequest , shape : Shape ) -> Any :
802
+ def _create_event_stream (self , request : Request , shape : Shape ) -> Any :
803
803
# TODO handle event streams
804
804
raise NotImplementedError ("_create_event_stream" )
805
805
@@ -814,7 +814,7 @@ class BaseJSONRequestParser(RequestParser, ABC):
814
814
815
815
def _parse_structure (
816
816
self ,
817
- request : HttpRequest ,
817
+ request : Request ,
818
818
shape : StructureShape ,
819
819
value : Optional [dict ],
820
820
uri_params : Mapping [str , Any ] = None ,
@@ -839,7 +839,7 @@ def _parse_structure(
839
839
840
840
def _parse_map (
841
841
self ,
842
- request : HttpRequest ,
842
+ request : Request ,
843
843
shape : MapShape ,
844
844
value : Optional [dict ],
845
845
uri_params : Mapping [str , Any ] = None ,
@@ -855,7 +855,7 @@ def _parse_map(
855
855
parsed [actual_key ] = actual_value
856
856
return parsed
857
857
858
- def _parse_body_as_json (self , request : HttpRequest ) -> dict :
858
+ def _parse_body_as_json (self , request : Request ) -> dict :
859
859
body_contents = request .data
860
860
if not body_contents :
861
861
return {}
@@ -871,12 +871,12 @@ def _parse_body_as_json(self, request: HttpRequest) -> dict:
871
871
raise ProtocolParserError ("HTTP body could not be parsed as JSON." ) from e
872
872
873
873
def _parse_boolean (
874
- self , request : HttpRequest , shape : Shape , node : bool , uri_params : Mapping [str , Any ] = None
874
+ self , request : Request , shape : Shape , node : bool , uri_params : Mapping [str , Any ] = None
875
875
) -> bool :
876
876
return super ()._noop_parser (request , shape , node , uri_params )
877
877
878
878
def _parse_blob (
879
- self , request : HttpRequest , shape : Shape , node : bool , uri_params : Mapping [str , Any ] = None
879
+ self , request : Request , shape : Shape , node : bool , uri_params : Mapping [str , Any ] = None
880
880
) -> bytes :
881
881
if isinstance (node , bytes ) and request .mimetype .startswith ("application/x-amz-cbor" ):
882
882
# CBOR does not base64 encode binary data
@@ -894,7 +894,7 @@ class JSONRequestParser(BaseJSONRequestParser):
894
894
"""
895
895
896
896
@_handle_exceptions
897
- def parse (self , request : HttpRequest ) -> Tuple [OperationModel , Any ]:
897
+ def parse (self , request : Request ) -> Tuple [OperationModel , Any ]:
898
898
target = request .headers ["X-Amz-Target" ]
899
899
# assuming that the last part of the target string (e.g., "x.y.z.MyAction") contains the operation name
900
900
operation_name = target .rpartition ("." )[2 ]
@@ -906,7 +906,7 @@ def parse(self, request: HttpRequest) -> Tuple[OperationModel, Any]:
906
906
return operation , final_parsed
907
907
908
908
def _do_parse (
909
- self , request : HttpRequest , shape : Shape , uri_params : Mapping [str , Any ] = None
909
+ self , request : Request , shape : Shape , uri_params : Mapping [str , Any ] = None
910
910
) -> dict :
911
911
parsed = {}
912
912
if shape is not None :
@@ -917,12 +917,12 @@ def _do_parse(
917
917
parsed = self ._handle_json_body (request , shape , uri_params )
918
918
return parsed
919
919
920
- def _handle_event_stream (self , request : HttpRequest , shape : Shape , event_name : str ):
920
+ def _handle_event_stream (self , request : Request , shape : Shape , event_name : str ):
921
921
# TODO handle event streams
922
922
raise NotImplementedError
923
923
924
924
def _handle_json_body (
925
- self , request : HttpRequest , shape : Shape , uri_params : Mapping [str , Any ] = None
925
+ self , request : Request , shape : Shape , uri_params : Mapping [str , Any ] = None
926
926
) -> Any :
927
927
# The json.loads() gives us the primitive JSON types, but we need to traverse the parsed JSON data to convert
928
928
# to richer types (blobs, timestamps, etc.)
@@ -938,10 +938,10 @@ class RestJSONRequestParser(BaseRestRequestParser, BaseJSONRequestParser):
938
938
The operation is defined by the HTTP method and the path suffix.
939
939
"""
940
940
941
- def _initial_body_parse (self , request : HttpRequest ) -> dict :
941
+ def _initial_body_parse (self , request : Request ) -> dict :
942
942
retur
10000
n self ._parse_body_as_json (request )
943
943
944
- def _create_event_stream (self , request : HttpRequest , shape : Shape ) -> Any :
944
+ def _create_event_stream (self , request : Request , shape : Shape ) -> Any :
945
945
raise NotImplementedError
946
946
947
947
@@ -977,7 +977,7 @@ class VirtualHostRewriter:
977
977
a request instead of EnvironBuilder, we should copy it before parsing (except the stream).
978
978
"""
979
979
980
- def __init__ (self , request : HttpRequest ):
980
+ def __init__ (self , request : Request ):
981
981
self .request = request
982
982
self .old_host = None
983
983
self .old_path = None
@@ -1017,7 +1017,7 @@ def __exit__(self, exc_type, exc_value, exc_traceback):
1017
1017
1018
1018
@staticmethod
1019
1019
def _set_request_props (
1020
- request : HttpRequest , path : str , host : str , raw_uri : Optional [str ] = None
1020
+ request : Request , path : str , host : str , raw_uri : Optional [str ] = None
1021
1021
):
1022
1022
"""Sets the HTTP request's path and host and clears the cache in the request object."""
1023
1023
request .path = path
@@ -1044,13 +1044,13 @@ def _set_request_props(
1044
1044
pass
1045
1045
1046
1046
@staticmethod
1047
- def _is_vhost_address_get_bucket (request : HttpRequest ) -> str | None :
1047
+ def _is_vhost_address_get_bucket (request : Request ) -> str | None :
1048
1048
from localstack .services .s3 .utils import uses_host_addressing
1049
1049
1050
1050
return uses_host_addressing (request .headers )
1051
1051
1052
1052
@_handle_exceptions
1053
- def parse (self , request : HttpRequest ) -> Tuple [OperationModel , Any ]:
1053
+ def parse (self , request : Request ) -> Tuple [OperationModel , Any ]:
1054
1054
if not LEGACY_V2_S3_PROVIDER :
1055
1055
"""Handle virtual-host-addressing for S3."""
1056
1056
with self .VirtualHostRewriter (request ):
@@ -1059,7 +1059,7 @@ def parse(self, request: HttpRequest) -> Tuple[OperationModel, Any]:
1059
1059
return super ().parse (request )
1060
1060
1061
1061
def _parse_shape (
1062
- self , request : HttpRequest , shape : Shape , node : Any , uri_params : Mapping [str , Any ] = None
1062
+ self , request : Request , shape : Shape , node : Any , uri_params : Mapping [str , Any ] = None
1063
1063
) -> Any :
1064
1064
"""
1065
1065
Special handling of parsing the shape for s3 object-names (=key):
0 commit comments