// Do not try to tear down any PHP output buffers
const STREAM_ALLOW_OB = 2;
+ /**
+ * Takes HTTP headers in a name => value format and converts them to the weird format
+ * expected by stream().
+ * @param string[] $headers
+ * @return array[] [ $headers, $optHeaders ]
+ * @since 1.34
+ */
+ public static function preprocessHeaders( $headers ) {
+ $rawHeaders = [];
+ $optHeaders = [];
+ foreach ( $headers as $name => $header ) {
+ $nameLower = strtolower( $name );
+ if ( in_array( $nameLower, [ 'range', 'if-modified-since' ], true ) ) {
+ $optHeaders[$nameLower] = $header;
+ } else {
+ $rawHeaders[] = "$name: $header";
+ }
+ }
+ return [ $rawHeaders, $optHeaders ];
+ }
+
/**
* @param string $path Local filesystem path to a file
* @param array $params Options map, which includes:
--- /dev/null
+<?php
+
+use PHPUnit\Framework\TestCase;
+
+class HTTPFileStreamerTest extends TestCase {
+
+ /**
+ * @covers HTTPFileStreamer::preprocessHeaders
+ * @dataProvider providePreprocessHeaders
+ */
+ public function testPreprocessHeaders( array $input, array $expectedRaw, array $expectedOpt ) {
+ list( $actualRaw, $actualOpt ) = HTTPFileStreamer::preprocessHeaders( $input );
+ $this->assertSame( $expectedRaw, $actualRaw );
+ $this->assertSame( $expectedOpt, $actualOpt );
+ }
+
+ public function providePreprocessHeaders() {
+ return [
+ [
+ [ 'Vary' => 'cookie', 'Cache-Control' => 'private' ],
+ [ 'Vary: cookie', 'Cache-Control: private' ],
+ [],
+ ],
+ [
+ [
+ 'Range' => 'bytes=(123-456)',
+ 'Content-Type' => 'video/mp4',
+ 'If-Modified-Since' => 'Wed, 21 Oct 2015 07:28:00 GMT',
+ ],
+ [ 'Content-Type: video/mp4' ],
+ [ 'range' => 'bytes=(123-456)', 'if-modified-since' => 'Wed, 21 Oct 2015 07:28:00 GMT' ],
+ ],
+ ];
+ }
+
+}