Index: src/aphront/AphrontRequest.php =================================================================== --- src/aphront/AphrontRequest.php +++ src/aphront/AphrontRequest.php @@ -466,14 +466,44 @@ } - public static function getHTTPHeader($name, $default = null) { + /** + * Read the value of an HTTP header from `$_SERVER`, or a similar datasource. + * + * This function accepts a canonical header name, like `"Accept-Encoding"`, + * and looks up the appropriate value in `$_SERVER` (in this case, + * `"HTTP_ACCEPT_ENCODING"`). + * + * @param string Canonical header name, like `"Accept-Encoding"`. + * @param wild Default value to return if header is not present. + * @param array? Read this instead of `$_SERVER`. + * @return string|wild Header value if present, or `$default` if not. + */ + public static function getHTTPHeader($name, $default = null, $data = null) { // PHP mangles HTTP headers by uppercasing them and replacing hyphens with // underscores, then prepending 'HTTP_'. $php_index = strtoupper($name); $php_index = str_replace('-', '_', $php_index); - $php_index = 'HTTP_'.$php_index; - return idx($_SERVER, $php_index, $default); + $try_names = array(); + + $try_names[] = 'HTTP_'.$php_index; + if ($php_index == 'CONTENT_TYPE' || $php_index == 'CONTENT_LENGTH') { + // These headers may be available under alternate names. See + // http://www.php.net/manual/en/reserved.variables.server.php#110763 + $try_names[] = $php_index; + } + + if ($data === null) { + $data = $_SERVER; + } + + foreach ($try_names as $try_name) { + if (array_key_exists($try_name, $data)) { + return $data[$try_name]; + } + } + + return $default; } } Index: src/aphront/__tests__/AphrontRequestTestCase.php =================================================================== --- src/aphront/__tests__/AphrontRequestTestCase.php +++ src/aphront/__tests__/AphrontRequestTestCase.php @@ -131,4 +131,21 @@ } } + public function testGetHTTPHeader() { + $server_data = array( + 'HTTP_ACCEPT_ENCODING' => 'duck/quack', + 'CONTENT_TYPE' => 'cow/moo', + ); + + $this->assertEqual( + 'duck/quack', + AphrontRequest::getHTTPHeader('AcCePt-EncOdING', null, $server_data)); + $this->assertEqual( + 'cow/moo', + AphrontRequest::getHTTPHeader('cONTent-TyPE', null, $server_data)); + $this->assertEqual( + null, + AphrontRequest::getHTTPHeader('Pie-Flavor', null, $server_data)); + } + }