From: Ori Livneh Date: Sat, 9 May 2015 00:42:15 +0000 (-0700) Subject: WebRequest::getHeader: add optional flag to get back list X-Git-Tag: 1.31.0-rc.0~11452^2 X-Git-Url: http://git.cyclocoop.org/%24dirpuce/puce%24spip_lang_rtl.gif?a=commitdiff_plain;h=9622c07f463cd896402d5b2524dd684d871c345d;p=lhc%2Fweb%2Fwiklou.git WebRequest::getHeader: add optional flag to get back list * 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 . Change-Id: I2760f57adfa7b886c84044a6e9348a47ac307229 --- diff --git a/includes/WebRequest.php b/includes/WebRequest.php index 054eceb97c..a5fd9d8fb0 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -38,6 +38,12 @@ 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() { diff --git a/tests/phpunit/includes/FauxRequestTest.php b/tests/phpunit/includes/FauxRequestTest.php index 745a5b42f1..eca5b395fb 100644 --- a/tests/phpunit/includes/FauxRequestTest.php +++ b/tests/phpunit/includes/FauxRequestTest.php @@ -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' ) + ); } }