diff --git a/apps/bootstrap/composer.json b/apps/bootstrap/composer.json
index 86e399b..b2300b2 100644
--- a/apps/bootstrap/composer.json
+++ b/apps/bootstrap/composer.json
@@ -12,9 +12,6 @@
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
- "config": {
- "vendor-dir": "vendor"
- },
"minimum-stability": "dev",
"require": {
"php": ">=5.3.0",
diff --git a/tests/unit/framework/web/ResponseTest.php b/tests/unit/framework/web/ResponseTest.php
index b3d9080..2fde63d 100644
--- a/tests/unit/framework/web/ResponseTest.php
+++ b/tests/unit/framework/web/ResponseTest.php
@@ -41,7 +41,7 @@ class ResponseTest extends \yiiunit\TestCase
static::$httpResponseCode = 200;
}
- public function ranges()
+ public function rightRanges()
{
// TODO test more cases for range requests and check for rfc compatibility
// http://www.w3.org/Protocols/rfc2616/rfc2616.txt
@@ -53,14 +53,14 @@ class ResponseTest extends \yiiunit\TestCase
}
/**
- * @dataProvider ranges
+ * @dataProvider rightRanges
*/
public function testSendFileRanges($rangeHeader, $expectedHeader, $length, $expectedFile)
{
$content = $this->generateTestFileContent();
-
$_SERVER['HTTP_RANGE'] = 'bytes=' . $rangeHeader;
$sent = $this->runSendFile('testFile.txt', $content, null);
+
$this->assertEquals($expectedFile, $sent);
$this->assertTrue(in_array('HTTP/1.1 206 Partial Content', static::$headers));
$this->assertTrue(in_array('Accept-Ranges: bytes', static::$headers));
@@ -69,6 +69,30 @@ class ResponseTest extends \yiiunit\TestCase
$this->assertTrue(in_array('Content-Length: ' . $length, static::$headers));
}
+ public function wrongRanges()
+ {
+ // TODO test more cases for range requests and check for rfc compatibility
+ // http://www.w3.org/Protocols/rfc2616/rfc2616.txt
+ return array(
+ array('1-2,3-5,6-10'), // multiple range request not supported
+ array('5-1'), // last-byte-pos value is less than its first-byte-pos value
+ array('-100000'), // last-byte-pos bigger then content length
+ array('10000-'), // first-byte-pos bigger then content length
+ );
+ }
+
+ /**
+ * @dataProvider wrongRanges
+ */
+ public function testSendFileWrongRanges($rangeHeader)
+ {
+ $this->setExpectedException('yii\base\HttpException', 'Requested Range Not Satisfiable');
+
+ $content = $this->generateTestFileContent();
+ $_SERVER['HTTP_RANGE'] = 'bytes=' . $rangeHeader;
+ $this->runSendFile('testFile.txt', $content, null);
+ }
+
protected function generateTestFileContent()
{
return '12ёжик3456798áèabcdefghijklmnopqrstuvwxyz!"§$%&/(ёжик)=?';
@@ -83,4 +107,4 @@ class ResponseTest extends \yiiunit\TestCase
$file = ob_get_clean();
return $file;
}
-}
\ No newline at end of file
+}
diff --git a/yii/composer.json b/yii/composer.json
index eb4c734..c8c0dd3 100644
--- a/yii/composer.json
+++ b/yii/composer.json
@@ -64,10 +64,14 @@
"source": "https://github.com/yiisoft/yii2"
},
"require": {
- "php": ">=5.3.0",
- "michelf/php-markdown": "1.3",
- "twig/twig": "1.12.*",
- "smarty/smarty": "3.1.*",
- "ezyang/htmlpurifier": "v4.5.0"
+ "php": ">=5.3.11",
+ "ext-mbstring": "*",
+ "lib-pcre": "*"
+ },
+ "suggest": {
+ "michelf/php-markdown": "Required for Markdown helper.",
+ "twig/twig": "Required for TwigViewRenderer.",
+ "smarty/smarty": "Required for SmartyViewRenderer.",
+ "ezyang/htmlpurifier": "Required for Purifier helper."
}
}
diff --git a/yii/requirements/requirements.php b/yii/requirements/requirements.php
index a703fde..125ff60 100644
--- a/yii/requirements/requirements.php
+++ b/yii/requirements/requirements.php
@@ -2,6 +2,8 @@
/**
* This is the Yii core requirements for the [[YiiRequirementChecker]] instance.
* These requirements are mandatory for any Yii application.
+ *
+ * @var $this YiiRequirementChecker
*/
return array(
array(
@@ -36,4 +38,11 @@ return array(
'by' => 'Multibyte string processing',
'memo' => 'Required for multibyte encoding string processing.'
),
+ array(
+ 'name' => 'Intl extension',
+ 'mandatory' => true,
+ 'condition' => $this->checkPhpExtensionVersion('intl', '1.0.2'),
+ 'by' => 'Internationalization support',
+ 'memo' => 'PHP Intl extension 1.0.2 or higher is required.'
+ ),
);
\ No newline at end of file
diff --git a/yii/web/Response.php b/yii/web/Response.php
index 954c999..3140c54 100644
--- a/yii/web/Response.php
+++ b/yii/web/Response.php
@@ -50,7 +50,7 @@ class Response extends \yii\base\Response
if (isset($_SERVER['HTTP_RANGE'])) {
// client sent us a multibyte range, can not hold this one for now
- if (strpos(',', $_SERVER['HTTP_RANGE']) !== false) {
+ if (strpos($_SERVER['HTTP_RANGE'],',') !== false) {
header("Content-Range: bytes $contentStart-$contentEnd/$fileSize");
throw new HttpException(416, 'Requested Range Not Satisfiable');
}
@@ -63,14 +63,18 @@ class Response extends \yii\base\Response
} else {
$range = explode('-', $range);
$contentStart = $range[0];
- $contentEnd = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $fileSize - 1;
+
+ // check if the last-byte-pos presents in header
+ if ((isset($range[1]) && is_numeric($range[1]))) {
+ $contentEnd = $range[1];
+ }
}
/* Check the range and make sure it's treated according to the specs.
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
*/
// End bytes can not be larger than $end.
- $contentEnd = ($contentEnd > $fileSize) ? $fileSize : $contentEnd;
+ $contentEnd = ($contentEnd > $fileSize) ? $fileSize -1 : $contentEnd;
// Validate the requested range and return an error if it's not correct.
$wrongContentStart = ($contentStart > $contentEnd || $contentStart > $fileSize - 1 || $contentStart < 0);