From 4ec763f7ce5a56f5e0a9440500030a39ae2ee1b1 Mon Sep 17 00:00:00 2001 From: Mihail Andreev Date: Thu, 20 Apr 2023 14:40:31 +0300 Subject: [PATCH] Add support for mulitipart file send In the openapi documetation the examples for file upload are with multipart. This change trys to support basic case of file(s) in the request body. The responisbility to pass correct files for now is passed to the user of the library. --- openapi3/paths.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/openapi3/paths.py b/openapi3/paths.py index f8d0f2e..2a593dd 100644 --- a/openapi3/paths.py +++ b/openapi3/paths.py @@ -266,7 +266,7 @@ def _request_handle_parameters(self, parameters={}): self._request.url = self._request.url.format(**path_parameters) - def _request_handle_body(self, data): + def _request_handle_body(self, data, files): if "application/json" in self.requestBody.content: if isinstance(data, dict) or isinstance(data, list): body = json.dumps(data) @@ -280,10 +280,22 @@ def _request_handle_body(self, data): self._request.data = body self._request.headers["Content-Type"] = "application/json" + elif "multipart/form-data" in self.requestBody.content: + if issubclass(type(data), Model): + raise NotImplementedError("Passed Model for multipart body") + + multipart_schema = self.requestBody.content['multipart/form-data'] + if isinstance(files, dict) and len(files) > 0: + self._request.files = files + + if isinstance(data, dict) or isinstance(data, list): + body = json.dumps(data) + + self._request.headers["Content-Type"] = "multipart/form-data" else: - raise NotImplementedError() + raise NotImplementedError("Not implemented body content type") - def request(self, base_url, security={}, data=None, parameters={}, verify=True, session=None, raw_response=False): + def request(self, base_url, security={}, data=None, parameters={}, verify=True, session=None, raw_response=False, files={}): """ Sends an HTTP request as described by this Path @@ -333,7 +345,7 @@ def request(self, base_url, security={}, data=None, parameters={}, verify=True, err_msg = "Request Body is required but none was provided." raise ValueError(err_msg) - self._request_handle_body(data) + self._request_handle_body(data, files) self._request_handle_parameters(parameters)