From a818c667e50ec45397766f1f044ecf39e9f7a072 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gerg=C5=91=20Tisza?= Date: Fri, 19 Apr 2019 17:12:59 -0700 Subject: [PATCH] Add helper for HTTPFileStreamer header syntax Adds a helper function for transforming an intuitive header array to the peculiar syntax expected by HTTPFileStreamer and the related FileRepo/FileBackend streaming methods. Change-Id: Idac9281b0f1b3c93f4ec1d1c3f336db110e5d260 (cherry picked from commit 65648f5523c9d1b772106e16e2adf57870892bc7) --- .../libs/filebackend/HTTPFileStreamer.php | 21 +++++++++++ .../filebackend/HTTPFileStreamerTest.php | 36 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 tests/phpunit/includes/filebackend/HTTPFileStreamerTest.php diff --git a/includes/libs/filebackend/HTTPFileStreamer.php b/includes/libs/filebackend/HTTPFileStreamer.php index 9f8959cba0..e77d4d421d 100644 --- a/includes/libs/filebackend/HTTPFileStreamer.php +++ b/includes/libs/filebackend/HTTPFileStreamer.php @@ -39,6 +39,27 @@ class HTTPFileStreamer { // 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: diff --git a/tests/phpunit/includes/filebackend/HTTPFileStreamerTest.php b/tests/phpunit/includes/filebackend/HTTPFileStreamerTest.php new file mode 100644 index 0000000000..bb025b6205 --- /dev/null +++ b/tests/phpunit/includes/filebackend/HTTPFileStreamerTest.php @@ -0,0 +1,36 @@ +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' ], + ], + ]; + } + +} -- 2.20.1