WebRequest::getHeader: add optional flag to get back list
authorOri Livneh <ori@wikimedia.org>
Sat, 9 May 2015 00:42:15 +0000 (17:42 -0700)
committerOri Livneh <ori@wikimedia.org>
Sat, 9 May 2015 00:58:54 +0000 (17:58 -0700)
* Add a stub FauxRequest::initHeaders method. This allows FauxRequest to
  use WebRequest's getHeader implemention, leading to less code duplication.
* Add an optional $flags parameter to WebRequest::getHeader. When the flag
  WebRequest::GETHEADER_LIST is set, treat the header as a comma-separated
  list of values (per RFC 2616 § 4.2) and return an array.
  (Initial use-case: Ibb292d241's treatment of If-None-Match header.)
* Add test.

See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html>.

Change-Id: I2760f57adfa7b886c84044a6e9348a47ac307229

includes/WebRequest.php
tests/phpunit/includes/FauxRequestTest.php

index 054eceb..a5fd9d8 100644 (file)
 class WebRequest {
        protected $data, $headers = array();
 
+       /**
+        * Flag to make WebRequest::getHeader return an array of values.
+        * @since 1.26
+        */
+       const GETHEADER_LIST = 1;
+
        /**
         * Lazy-init response object
         * @var WebResponse
@@ -894,19 +900,28 @@ class WebRequest {
        }
 
        /**
-        * Get a request header, or false if it isn't set
-        * @param string $name Case-insensitive header name
+        * Get a request header, or false if it isn't set.
         *
-        * @return string|bool False on failure
-        */
-       public function getHeader( $name ) {
+        * @param string $name Case-insensitive header name
+        * @param int $flags Bitwise combination of:
+        *   WebRequest::GETHEADER_LIST  Treat the header as a comma-separated list
+        *                               of values, as described in RFC 2616 § 4.2.
+        *                               (since 1.26).
+        * @return string|array|bool False if header is unset; otherwise the
+        *  header value(s) as either a string (the default) or an array, if
+        *  WebRequest::GETHEADER_LIST flag was set.
+        */
+       public function getHeader( $name, $flags = 0 ) {
                $this->initHeaders();
                $name = strtoupper( $name );
-               if ( isset( $this->headers[$name] ) ) {
-                       return $this->headers[$name];
-               } else {
+               if ( !isset( $this->headers[$name] ) ) {
                        return false;
                }
+               $value = $this->headers[$name];
+               if ( $flags & self::GETHEADER_LIST ) {
+                       $value = array_map( 'trim', explode( ',', $value ) );
+               }
+               return $value;
        }
 
        /**
@@ -1374,13 +1389,8 @@ class FauxRequest extends WebRequest {
                return $this->protocol;
        }
 
-       /**
-        * @param string $name The name of the header to get (case insensitive).
-        * @return bool|string
-        */
-       public function getHeader( $name ) {
-               $name = strtoupper( $name );
-               return isset( $this->headers[$name] ) ? $this->headers[$name] : false;
+       private function initHeaders() {
+               return;
        }
 
        /**
@@ -1488,8 +1498,8 @@ class DerivativeRequest extends FauxRequest {
                return $this->base->checkSessionCookie();
        }
 
-       public function getHeader( $name ) {
-               return $this->base->getHeader( $name );
+       public function getHeader( $name, $flags = 0 ) {
+               return $this->base->getHeader( $name, $flags );
        }
 
        public function getAllHeaders() {
index 745a5b4..eca5b39 100644 (file)
@@ -6,13 +6,18 @@ class FauxRequestTest extends MediaWikiTestCase {
         * @covers FauxRequest::getHeader
         */
        public function testGetSetHeader() {
-               $value = 'test/test';
+               $value = 'text/plain, text/html';
 
                $request = new FauxRequest();
-               $request->setHeader( 'Content-Type', $value );
+               $request->setHeader( 'Accept', $value );
 
-               $this->assertEquals( $request->getHeader( 'Content-Type' ), $value );
-               $this->assertEquals( $request->getHeader( 'CONTENT-TYPE' ), $value );
-               $this->assertEquals( $request->getHeader( 'content-type' ), $value );
+               $this->assertEquals( $request->getHeader( 'Nonexistent' ), false );
+               $this->assertEquals( $request->getHeader( 'Accept' ), $value );
+               $this->assertEquals( $request->getHeader( 'ACCEPT' ), $value );
+               $this->assertEquals( $request->getHeader( 'accept' ), $value );
+               $this->assertEquals(
+                       $request->getHeader( 'Accept', WebRequest::GETHEADER_LIST ),
+                       array( 'text/plain', 'text/html' )
+               );
        }
 }