From a3648a6667268fb2ab80baf982a902c086c9b91c Mon Sep 17 00:00:00 2001 From: Pato05 <20874747+Pato05@users.noreply.github.com> Date: Mon, 13 Jul 2020 23:07:43 +0200 Subject: [PATCH 1/2] Add addFileFromString method. --- src/Body/FormBody.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Body/FormBody.php b/src/Body/FormBody.php index 83358210..2a2c83ac 100644 --- a/src/Body/FormBody.php +++ b/src/Body/FormBody.php @@ -90,6 +90,21 @@ public function addFiles(array $data, string $contentType = 'application/octet-s } } + /** + * Add a file field to the form from a string. + * + * @param string $name + * @param string $fileContent + * @param string $fileName + * @param string $contentType + */ + public function addFileFromString(string $name, string $fileContent, string $fileName, string $contentType = 'application/octet-stream'): void + { + $this->fields[] = [$name, $fileContent, $contentType, $fileName]; + $this->isMultipart = true; + $this->resetCache(); + } + /** * Returns an array of fields, each being an array of [name, value, content-type, file-name|null]. * Both fields and files are returned in the array. Files use a FileBody object as the value. The file-name is From 9899cbde785c8b5c41368e1f85df9095281090c8 Mon Sep 17 00:00:00 2001 From: Pato05 <20874747+Pato05@users.noreply.github.com> Date: Mon, 13 Jul 2020 23:45:47 +0200 Subject: [PATCH 2/2] Add Content-Length header and make some improvements. --- src/Body/FormBody.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Body/FormBody.php b/src/Body/FormBody.php index 2a2c83ac..3206b3c4 100644 --- a/src/Body/FormBody.php +++ b/src/Body/FormBody.php @@ -150,8 +150,8 @@ private function getMultipartFieldArray(): array /** @psalm-suppress PossiblyNullArgument */ $fields[] = $field instanceof FileBody - ? $this->generateMultipartFileHeader($name, $fileName, $contentType) - : $this->generateMultipartFieldHeader($name, $contentType); + ? $this->generateMultipartFileHeader($name, $fileName, $field, $contentType) + : $this->generateMultipartFieldHeader($name, $field, $contentType); $fields[] = $field; $fields[] = "\r\n"; @@ -162,23 +162,23 @@ private function getMultipartFieldArray(): array return $this->cachedFields = $fields; } - private function generateMultipartFileHeader(string $name, string $fileName, string $contentType): string + private function generateMultipartFileHeader(string $name, string $fileName, FileBody $field, string $contentType): string { $header = "Content-Disposition: form-data; name=\"{$name}\"; filename=\"{$fileName}\"\r\n"; $header .= "Content-Type: {$contentType}\r\n"; + $header .= "Content-Length: " . \Amp\Promise\wait($field->getBodyLength()) . "\r\n"; $header .= "Content-Transfer-Encoding: binary\r\n\r\n"; return $header; } - private function generateMultipartFieldHeader(string $name, string $contentType): string + private function generateMultipartFieldHeader(string $name, string $content, string $contentType): string { $header = "Content-Disposition: form-data; name=\"{$name}\"\r\n"; if ($contentType !== "") { - $header .= "Content-Type: {$contentType}\r\n\r\n"; - } else { - $header .= "\r\n"; + $header .= "Content-Type: {$contentType}\r\n"; } + $header .= "Content-Length: " . strlen($content) . "\r\n\r\n"; return $header; }