diff --git a/apimatic_core/configurations/global_configuration.py b/apimatic_core/configurations/global_configuration.py index 2befe69..f726b83 100644 --- a/apimatic_core/configurations/global_configuration.py +++ b/apimatic_core/configurations/global_configuration.py @@ -1,3 +1,5 @@ +from requests.structures import CaseInsensitiveDict + from apimatic_core.http.configurations.http_client_configuration import HttpClientConfiguration from apimatic_core.utilities.api_helper import ApiHelper @@ -27,8 +29,8 @@ def __init__( ): self._http_client_configuration = http_client_configuration self._global_errors = {} - self._global_headers = {} - self._additional_headers = {} + self._global_headers = CaseInsensitiveDict() + self._additional_headers = CaseInsensitiveDict() self._auth_managers = {} self._base_uri_executor = None diff --git a/apimatic_core/request_builder.py b/apimatic_core/request_builder.py index 64b6687..d017737 100644 --- a/apimatic_core/request_builder.py +++ b/apimatic_core/request_builder.py @@ -1,3 +1,5 @@ +from requests.structures import CaseInsensitiveDict + from apimatic_core.exceptions.auth_validation_exception import AuthValidationException from apimatic_core.http.request.http_request import HttpRequest from apimatic_core.types.array_serialization_format import SerializationFormats @@ -15,12 +17,11 @@ def get_param_name(param_value): def __init__( self ): - self._server = None self._path = None self._http_method = None self._template_params = {} - self._header_params = {} + self._header_params = CaseInsensitiveDict() self._query_params = {} self._form_params = {} self._additional_form_params = {} @@ -107,10 +108,10 @@ def xml_attributes(self, xml_attributes): def build(self, global_configuration): _url = self.process_url(global_configuration) - _request_headers = self.process_request_headers(global_configuration) - _request_body = self.process_body_params() + _request_headers = self.process_request_headers(global_configuration) + _multipart_params = self.process_multipart_params() http_request = HttpRequest(http_method=self._http_method, @@ -147,14 +148,19 @@ def process_request_headers(self, global_configuration): additional_headers = global_configuration.get_additional_headers() if global_headers: - prepared_headers = {key: str(value) if value is not None else value - for key, value in self._header_params.items()} - request_headers = {**global_headers, **prepared_headers} + request_headers = {**global_headers, **self._header_params} if additional_headers: request_headers.update(additional_headers) - return request_headers + serialized_headers = CaseInsensitiveDict( + { + key: ApiHelper.json_serialize(value) + if value is not None else value + for key, value in request_headers.items() + } + ) + return serialized_headers def process_body_params(self): if self._xml_attributes: diff --git a/setup.py b/setup.py index c620b96..4d51d1e 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( name='apimatic-core', - version='0.2.18', + version='0.2.19', description='A library that contains core logic and utilities for ' 'consuming REST APIs using Python SDKs generated by APIMatic.', long_description=long_description, diff --git a/tests/apimatic_core/request_builder_tests/test_request_builder.py b/tests/apimatic_core/request_builder_tests/test_request_builder.py index 7f84b20..ddbd78f 100644 --- a/tests/apimatic_core/request_builder_tests/test_request_builder.py +++ b/tests/apimatic_core/request_builder_tests/test_request_builder.py @@ -176,62 +176,68 @@ def test_additional_query_params(self, input_additional_query_params_value, expe assert http_request.query_url == 'http://localhost:3000/test?{}'.format(expected_additional_query_params_value) @pytest.mark.parametrize('input_local_header_param_value, expected_local_header_param_value', [ - ('string', {'header_param': 'string'}), - (500, {'header_param': 500}), - (500.12, {'header_param': 500.12}), - (str(date(1994, 2, 13)), {'header_param': '1994-02-13'}), + ('string', {'header': 'string'}), + (200, {'header': '200'}), + (200.12, {'header': '200.12'}), + (str(date(1994, 2, 13)), {'header': '1994-02-13'}), (ApiHelper.UnixDateTime.from_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': 761117415}), + {'header': '761117415'}), (Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': '{}'.format(Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), + {'header': '{}'.format(Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), (Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': '{}'.format(Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), - ([1, 2, 3, 4], {'header_param': [1, 2, 3, 4]}) + {'header': '{}'.format(Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), + ([1, 2, 3, 4], {'header': '[1, 2, 3, 4]'}), + ({'alpha': 'val', 'beta': 'val'}, {'header': '{"alpha": "val", "beta": "val"}'}), + (Base.employee_model(), {'header': ApiHelper.json_serialize(Base.employee_model())}) ]) def test_local_headers(self, input_local_header_param_value, expected_local_header_param_value): http_request = self.new_request_builder \ .header_param(Parameter() - .key('header_param') + .key('header') .value(input_local_header_param_value)) \ .build(self.global_configuration) assert http_request.headers == expected_local_header_param_value @pytest.mark.parametrize('input_global_header_param_value, expected_global_header_param_value', [ - ('my-string', {'header_param': 'my-string'}), - (5000, {'header_param': 5000}), - (5000.12, {'header_param': 5000.12}), - (str(date(1998, 2, 13)), {'header_param': '1998-02-13'}), + ('my-string', {'global_header': 'my-string'}), + (5000, {'global_header': '5000'}), + (5000.12, {'global_header': '5000.12'}), + (str(date(1998, 2, 13)), {'global_header': '1998-02-13'}), (ApiHelper.UnixDateTime.from_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': 761117415}), + {'global_header': '761117415'}), (Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': '{}'.format(Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), + {'global_header': '{}'.format(Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), (Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': '{}'.format(Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), - ([100, 200, 300, 400], {'header_param': [100, 200, 300, 400]}) + {'global_header': '{}'.format(Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), + ([100, 200, 300, 400], {'global_header': '[100, 200, 300, 400]'}), + ({'key1': 'val1', 'key2': 'val2'}, {'global_header': '{"key1": "val1", "key2": "val2"}'}), + (Base.employee_model(), {'global_header': ApiHelper.json_serialize(Base.employee_model())}) ]) def test_global_headers(self, input_global_header_param_value, expected_global_header_param_value): http_request = self.new_request_builder \ .build(self.global_configuration - .global_header('header_param', input_global_header_param_value)) + .global_header('global_header', input_global_header_param_value)) assert http_request.headers == expected_global_header_param_value @pytest.mark.parametrize('input_additional_header_param_value, expected_additional_header_param_value', [ - ('my-string', {'header_param': 'my-string'}), - (5000, {'header_param': 5000}), - (5000.12, {'header_param': 5000.12}), - (str(date(1998, 2, 13)), {'header_param': '1998-02-13'}), + ('my-string', {'additional_header': 'my-string'}), + (2000, {'additional_header': '2000'}), + (2000.12, {'additional_header': '2000.12'}), + (str(date(1998, 2, 13)), {'additional_header': '1998-02-13'}), (ApiHelper.UnixDateTime.from_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': 761117415}), + {'additional_header': '761117415'}), (Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': '{}'.format(Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), + {'additional_header': '{}'.format(Base.get_http_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), (Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)), - {'header_param': '{}'.format(Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), - ([100, 200, 300, 400], {'header_param': [100, 200, 300, 400]}) + {'additional_header': '{}'.format(Base.get_rfc3339_datetime(datetime(1994, 2, 13, 5, 30, 15)))}), + ([100, 200, 300, 400], {'additional_header': '[100, 200, 300, 400]'}), + ({'alpha': 'val1', 'bravo': 'val2'}, {'additional_header': '{"alpha": "val1", "bravo": "val2"}'}), + (Base.employee_model(), {'additional_header': ApiHelper.json_serialize(Base.employee_model())}) ]) def test_additional_headers(self, input_additional_header_param_value, expected_additional_header_param_value): http_request = self.new_request_builder \ .build(self.global_configuration - .additional_header('header_param', input_additional_header_param_value)) + .additional_header('additional_header', input_additional_header_param_value)) assert http_request.headers == expected_additional_header_param_value @pytest.mark.parametrize('input_global_header_param_value,' @@ -510,7 +516,7 @@ def test_file_as_body_param(self, input_body_param_value, expected_body_param_va actual_body_param_value = http_request.parameters assert actual_body_param_value.read() == expected_body_param_value.read() \ - and http_request.headers['content-type'] == expected_content_type + and http_request.headers['Content-Type'] == expected_content_type finally: actual_body_param_value.close() expected_body_param_value.close()