mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-22 23:02:42 +01:00
Support "Range: bytes=123-" requests
Summary: Ref T12219. We currently only support Range requests like "bytes=123-456", but "bytes=123-", meaning "until end of file", is valid, and Chrome can send these requests. I suspect this is the issue with T12219. Test Plan: Used `nc local.phacility.com 80` to pipe raw requests, saw both "bytes=123-456" and "bytes=123-" requests satisfied correctly. Reviewers: chad Reviewed By: chad Maniphest Tasks: T12219 Differential Revision: https://secure.phabricator.com/D17626
This commit is contained in:
parent
63828f5806
commit
d1a971e221
3 changed files with 23 additions and 3 deletions
|
@ -97,7 +97,12 @@ final class AphrontFileResponse extends AphrontResponse {
|
|||
if ($this->rangeMin || $this->rangeMax) {
|
||||
$len = $this->getContentLength();
|
||||
$min = $this->rangeMin;
|
||||
|
||||
$max = $this->rangeMax;
|
||||
if ($max === null) {
|
||||
$max = ($len - 1);
|
||||
}
|
||||
|
||||
$headers[] = array('Content-Range', "bytes {$min}-{$max}/{$len}");
|
||||
$content_len = ($max - $min) + 1;
|
||||
} else {
|
||||
|
|
|
@ -64,14 +64,21 @@ final class PhabricatorFileDataController extends PhabricatorFileController {
|
|||
$range = $request->getHTTPHeader('range');
|
||||
if ($range) {
|
||||
$matches = null;
|
||||
if (preg_match('/^bytes=(\d+)-(\d+)$/', $range, $matches)) {
|
||||
if (preg_match('/^bytes=(\d+)-(\d*)$/', $range, $matches)) {
|
||||
// Note that the "Range" header specifies bytes differently than
|
||||
// we do internally: the range 0-1 has 2 bytes (byte 0 and byte 1).
|
||||
$begin = (int)$matches[1];
|
||||
$end = (int)$matches[2] + 1;
|
||||
|
||||
// The "Range" may be "200-299" or "200-", meaning "until end of file".
|
||||
if (strlen($matches[2])) {
|
||||
$range_end = (int)$matches[2];
|
||||
$end = $range_end + 1;
|
||||
} else {
|
||||
$range_end = null;
|
||||
}
|
||||
|
||||
$response->setHTTPResponseCode(206);
|
||||
$response->setRange($begin, ($end - 1));
|
||||
$response->setRange($begin, $range_end);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,6 +91,14 @@ final class PhabricatorFileStorageFormatTestCase extends PhabricatorTestCase {
|
|||
$raw_data .= $data_chunk;
|
||||
}
|
||||
$this->assertEqual('cow jumped', $raw_data);
|
||||
|
||||
$iterator = $file->getFileDataIterator(4, null);
|
||||
$raw_data = '';
|
||||
foreach ($iterator as $data_chunk) {
|
||||
$raw_data .= $data_chunk;
|
||||
}
|
||||
$this->assertEqual('cow jumped over the full moon.', $raw_data);
|
||||
|
||||
}
|
||||
|
||||
public function testStorageTampering() {
|
||||
|
|
Loading…
Reference in a new issue