From 514093bea77f1ed6efaa12c9e8bb94c6adafe26c Mon Sep 17 00:00:00 2001 From: Asad Ali Date: Wed, 12 Oct 2022 15:17:49 +0500 Subject: [PATCH] fix(multipart-form-param): fixes issue of sending multipart object params (#14) --- src/Request/Parameters/FormParam.php | 11 +++++++++++ tests/ApiCallTest.php | 14 ++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Request/Parameters/FormParam.php b/src/Request/Parameters/FormParam.php index 6eab7d2..dfac2b7 100644 --- a/src/Request/Parameters/FormParam.php +++ b/src/Request/Parameters/FormParam.php @@ -5,6 +5,7 @@ namespace Core\Request\Parameters; use Core\Types\Sdk\CoreFileWrapper; +use Core\Utils\CoreHelper; use CoreInterfaces\Core\Request\RequestArraySerialization; use CoreInterfaces\Core\Request\RequestSetterInterface; @@ -57,6 +58,12 @@ public function plain(): self return $this; } + private function isMultipart(): bool + { + return isset($this->encodingHeaders['content-type']) && + $this->encodingHeaders['content-type'] != 'application/x-www-form-urlencoded'; + } + /** * Adds the parameter to the request provided. * @@ -77,6 +84,10 @@ public function apply(RequestSetterInterface $request): void return; } $this->value = $this->prepareValue($this->value); + if ($this->isMultipart()) { + $request->addMultipartFormParam($this->key, CoreHelper::serialize($this->value)); + return; + } $encodedValue = $this->httpBuildQuery([$this->key => $this->value], $this->format); if (empty($encodedValue)) { return; diff --git a/tests/ApiCallTest.php b/tests/ApiCallTest.php index ad965a0..7cda81e 100644 --- a/tests/ApiCallTest.php +++ b/tests/ApiCallTest.php @@ -326,13 +326,17 @@ public function testSendSingleForm() $this->assertEquals([], $result->body['parametersMultipart']); } - public function testSendFileForm() + public function testSendMultipartFormParameters() { $result = MockHelper::newApiCall() ->requestBuilder((new RequestBuilder(RequestMethod::POST, '/simple/{tyu}')) - ->parameters(FormParam::init('myFile', MockHelper::getFileWrapper()))) - ->responseHandler(MockHelper::responseHandler() - ->type(MockClass::class)) + ->parameters( + FormParam::init('myFile', MockHelper::getFileWrapper()) + ->encodingHeader('content-type', 'image/png'), + FormParam::init('object', new MockClass(["key" => 234])) + ->encodingHeader('content-type', 'application/json') + )) + ->responseHandler(MockHelper::responseHandler()->type(MockClass::class)) ->execute(); $this->assertInstanceOf(MockClass::class, $result); $this->assertEquals([], $result->body['parametersEncoded']); @@ -342,6 +346,8 @@ public function testSendFileForm() $this->assertEquals('text/plain', $file->getMimeType()); $this->assertEquals('My Text', $file->getPostFilename()); $this->assertEquals($file, $result->body['parameters']['myFile']); + $object = $result->body['parametersMultipart']['object']; + $this->assertEquals('{"body":{"key":234}}', $object); } public function testSendFileFormWithEncodingHeader()