Skip to content

Commit b2af5fd

Browse files
committed
Merge pull request #6 from ftassi/multipart-post-data
Incomplete body for multipart request
2 parents ad0a018 + 61743c2 commit b2af5fd

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

src/Igorw/CgiHttpKernel/CgiHttpKernel.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQ
3737
if (count($request->files)) {
3838
$boundary = $this->getMimeBoundary();
3939
$request->headers->set('Content-Type', 'multipart/form-data; boundary='.$boundary);
40-
$requestBody = $this->encodeMultipartFiles($boundary, $request->files);
40+
$requestBody = $this->buildMultipartParameters($boundary, $request->request);
41+
$requestBody .= $this->encodeMultipartFiles($boundary, $request->files);
4142
}
4243

4344
$builder = ProcessBuilder::create()
@@ -189,6 +190,21 @@ private function getUrlEncodedParameterBag(ParameterBag $bag)
189190
return http_build_query($bag->all());
190191
}
191192

193+
private function buildMultipartParameters($boundary, ParameterBag $parameters)
194+
{
195+
$mimeBoundary = '--'.$boundary."\r\n";
196+
197+
$data = '';
198+
foreach ($parameters->all() as $name => $parameter) {
199+
$data .= $mimeBoundary;
200+
$data .= $this->buildMultipartParameter($name, $parameter);
201+
$data .= $mimeBoundary;
202+
}
203+
$data .= "\r\n";
204+
205+
return $data;
206+
}
207+
192208
private function encodeMultipartFiles($boundary, FileBag $files)
193209
{
194210
$mimeBoundary = '--'.$boundary."\r\n";
@@ -222,6 +238,17 @@ private function encodeMultipartFile($name, UploadedFile $file)
222238
return $data;
223239
}
224240

241+
private function buildMultipartParameter($fieldName, $fieldValue)
242+
{
243+
$eol = "\r\n";
244+
245+
$data = '';
246+
$data .= sprintf('Content-Disposition: form-data; name="%s"',$fieldName);
247+
$data .= $eol . $eol . $fieldValue . $eol;
248+
249+
return $data;
250+
}
251+
225252
private function getMimeBoundary()
226253
{
227254
return md5('cgi-http-kernel');

tests/functional/CgiHttpKernelTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,12 @@ public function uploadShouldPutFileInFiles()
219219
{
220220
$file = new UploadedFile(__DIR__.'/Fixtures/sadkitten.gif', 'sadkitten.gif', 'image/gif');
221221

222-
$request = Request::create('/upload.php', 'POST');
222+
$request = Request::create('/upload.php', 'POST', array('foo' => 'bar'));
223223
$request->files->add(array('kitten' => $file));
224224
$response = $this->kernel->handle($request);
225225

226226
$expected = implode("\n", array(
227+
'bar',
227228
'sadkitten.gif',
228229
'image/gif',
229230
'1304444',

tests/functional/Fixtures/upload.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
22

3+
echo $_POST['foo']."\n";
34
echo $_FILES['kitten']['name']."\n";
45
echo $_FILES['kitten']['type']."\n";
56
echo $_FILES['kitten']['size']."\n";

0 commit comments

Comments
 (0)