mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-03 13:58:55 +08:00
Fix #18313: Fix multipart form data parse with double quotes
This commit is contained in:
@ -10,7 +10,7 @@ Yii Framework 2 Change Log
|
|||||||
- Bug #18303: Fix creating migration issue for column methods used after defaultValues (wsaid)
|
- Bug #18303: Fix creating migration issue for column methods used after defaultValues (wsaid)
|
||||||
- Bug #18287: Fix for OUTPUT INSERTED and computed columns. Added flag to computed values in table schema (darkdef)
|
- Bug #18287: Fix for OUTPUT INSERTED and computed columns. Added flag to computed values in table schema (darkdef)
|
||||||
- Bug #18308: Fixed `\yii\base\Model::getErrorSummary()` reverse order (DrDeath72)
|
- Bug #18308: Fixed `\yii\base\Model::getErrorSummary()` reverse order (DrDeath72)
|
||||||
|
- Bug #18313: Fix multipart form data parse with double quotes (wsaid)
|
||||||
|
|
||||||
2.0.38 September 14, 2020
|
2.0.38 September 14, 2020
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|||||||
@ -141,10 +141,11 @@ class MultipartFormDataParser extends BaseObject implements RequestParserInterfa
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!preg_match('/boundary=(.*)$/is', $contentType, $matches)) {
|
if (!preg_match('/boundary="?(.*)"?$/is', $contentType, $matches)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
$boundary = $matches[1];
|
|
||||||
|
$boundary = trim($matches[1], '"');
|
||||||
|
|
||||||
$bodyParts = preg_split('/\\R?-+' . preg_quote($boundary, '/') . '/s', $rawBody);
|
$bodyParts = preg_split('/\\R?-+' . preg_quote($boundary, '/') . '/s', $rawBody);
|
||||||
array_pop($bodyParts); // last block always has no data, contains boundary ending like `--`
|
array_pop($bodyParts); // last block always has no data, contains boundary ending like `--`
|
||||||
|
|||||||
@ -52,6 +52,45 @@ class MultipartFormDataParserTest extends TestCase
|
|||||||
$this->assertStringEqualsFile($_FILES['Item']['tmp_name']['file'], 'item file content');
|
$this->assertStringEqualsFile($_FILES['Item']['tmp_name']['file'], 'item file content');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testParseWithDoubleQuotes()
|
||||||
|
{
|
||||||
|
if (defined('HHVM_VERSION')) {
|
||||||
|
static::markTestSkipped('Can not test on HHVM because it does not support proper handling of the temporary files.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$parser = new MultipartFormDataParser();
|
||||||
|
|
||||||
|
$boundary = '---------------------------22472926011618';
|
||||||
|
$contentType = 'multipart/form-data; boundary="' . $boundary . '"';
|
||||||
|
$rawBody = "--{$boundary}\nContent-Disposition: form-data; name=\"title\"\r\n\r\ntest-title";
|
||||||
|
$rawBody .= "\r\n--{$boundary}\nContent-Disposition: form-data; name=\"Item[name]\"\r\n\r\ntest-name";
|
||||||
|
$rawBody .= "\r\n--{$boundary}\nContent-Disposition: form-data; name=\"someFile\"; filename=\"some-file.txt\"\nContent-Type: text/plain\r\n\r\nsome file content";
|
||||||
|
$rawBody .= "\r\n--{$boundary}\nContent-Disposition: form-data; name=\"Item[file]\"; filename=\"item-file.txt\"\nContent-Type: text/plain\r\n\r\nitem file content";
|
||||||
|
$rawBody .= "\r\n--{$boundary}--";
|
||||||
|
|
||||||
|
$bodyParams = $parser->parse($rawBody, $contentType);
|
||||||
|
|
||||||
|
$expectedBodyParams = [
|
||||||
|
'title' => 'test-title',
|
||||||
|
'Item' => [
|
||||||
|
'name' => 'test-name',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$this->assertEquals($expectedBodyParams, $bodyParams);
|
||||||
|
|
||||||
|
$this->assertNotEmpty($_FILES['someFile']);
|
||||||
|
$this->assertEquals(UPLOAD_ERR_OK, $_FILES['someFile']['error']);
|
||||||
|
$this->assertEquals('some-file.txt', $_FILES['someFile']['name']);
|
||||||
|
$this->assertEquals('text/plain', $_FILES['someFile']['type']);
|
||||||
|
$this->assertStringEqualsFile($_FILES['someFile']['tmp_name'], 'some file content');
|
||||||
|
|
||||||
|
$this->assertNotEmpty($_FILES['Item']);
|
||||||
|
$this->assertNotEmpty($_FILES['Item']['name']['file']);
|
||||||
|
$this->assertEquals(UPLOAD_ERR_OK, $_FILES['Item']['error']['file']);
|
||||||
|
$this->assertEquals('item-file.txt', $_FILES['Item']['name']['file']);
|
||||||
|
$this->assertEquals('text/plain', $_FILES['Item']['type']['file']);
|
||||||
|
$this->assertStringEqualsFile($_FILES['Item']['tmp_name']['file'], 'item file content');
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @depends testParse
|
* @depends testParse
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user