Skip to content

Commit 591a605

Browse files
author
Greg Bowler
authored
fix: convert underscores to hyphens in http headers (#219)
closes #218
1 parent 5bb1736 commit 591a605

File tree

5 files changed

+46
-6
lines changed

5 files changed

+46
-6
lines changed

src/Header/HeaderLine.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class HeaderLine {
1010
protected $values;
1111

1212
public function __construct(string $name, string...$values) {
13+
$name = str_replace("_", "-", $name);
1314
$this->originalNameCase = $name;
1415
$this->name = strtolower($name);
1516
$this->values = $values;

src/RequestFactory.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function createServerRequestFromGlobalState(
4949
* @param array<string, string> $get
5050
* @param array<string, string> $post
5151
*/
52-
private function buildRequest(
52+
public function buildRequest(
5353
string $method,
5454
UriInterface $uri,
5555
RequestHeaders $headers,
@@ -85,7 +85,7 @@ private function buildRequest(
8585
/**
8686
* @param array<string, string> $server
8787
*/
88-
protected function buildRequestHeaders(array $server):RequestHeaders {
88+
public function buildRequestHeaders(array $server):RequestHeaders {
8989
$headers = new RequestHeaders();
9090
foreach($server as $key => $value) {
9191
if(str_starts_with($key, "HTTP_")) {
@@ -99,7 +99,7 @@ protected function buildRequestHeaders(array $server):RequestHeaders {
9999
/**
100100
* @param array<string, string> $server
101101
*/
102-
protected function buildUri(array $server):UriInterface {
102+
public function buildUri(array $server):UriInterface {
103103
$uri = new Uri($server["REQUEST_URI"] ?? null);
104104

105105
if($server["HTTPS"] ?? null) {

test/phpunit/Header/HeadersTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public function testContains() {
3737
$headers = new Headers(self::HEADER_ARRAY);
3838
self::assertTrue($headers->contains("Etag"));
3939
self::assertFalse($headers->contains("Ftag"));
40+
self::assertTrue($headers->contains("content-type"));
4041
}
4142

4243
public function testAdd() {
@@ -94,8 +95,8 @@ public function testGetNotExist() {
9495

9596
public function testGet() {
9697
$headers = new Headers(self::HEADER_ARRAY);
97-
$h = $headers->get("Date");
98-
self::assertEquals(self::HEADER_ARRAY["Date"], $h);
98+
self::assertEquals(self::HEADER_ARRAY["Date"], $headers->get("date"));
99+
self::assertEquals(self::HEADER_ARRAY["Content-Type"], $headers->get("content-type"));
99100
}
100101

101102
public function testGetMultiple() {
@@ -164,4 +165,4 @@ public function testCaseInsensitive() {
164165

165166
self::assertTrue($headers->contains("ConTent-Type"));
166167
}
167-
}
168+
}

test/phpunit/MessageTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?php
22
namespace Gt\Http\Test;
33

4+
use Gt\Http\Header\HeaderLine;
45
use Gt\Http\Header\RequestHeaders;
56
use Gt\Http\Request;
67
use Gt\Http\RequestMethod;
@@ -46,6 +47,26 @@ public function testGetProtocolVersionRequest(
4647
self::assertEquals($expected, $protocolVersion);
4748
}
4849

50+
public function testGetHeaderLine() {
51+
$headerName = "x-example";
52+
$headerValue = uniqid();
53+
54+
$headerLine = self::createMock(HeaderLine::class);
55+
$headerLine->expects(self::once())
56+
->method("getValuesCommaSeparated")
57+
->willReturn($headerValue);
58+
59+
$uri = self::createMock(Uri::class);
60+
$headers = self::createMock(RequestHeaders::class);
61+
$headers->expects(self::once())
62+
->method("get")
63+
->with($headerName)
64+
->willReturn($headerLine);
65+
66+
$sut = new Request("GET", $uri, $headers);
67+
self::assertSame($headerValue, $sut->getHeaderLine($headerName));
68+
}
69+
4970
public static function data_request():array {
5071
$data = [];
5172

test/phpunit/RequestFactoryTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,21 @@ public function testCreateServerRequestFromGlobals_headers():void {
100100
], [], [], []);
101101
self::assertEquals("1.1", $request->getProtocolVersion());
102102
}
103+
104+
public function testBuildRequestHeaders_hyphenated():void {
105+
$server = [
106+
"HTTP_ACCEPT" => "application/json",
107+
"HTTP_ACCEPT_LANGUAGE" => "en-GB",
108+
"HTTP_X_KEY" => "abc123",
109+
];
110+
111+
$sut = new RequestFactory();
112+
$requestHeaders = $sut->buildRequestHeaders($server);
113+
114+
foreach($server as $key => $value) {
115+
$keyWithoutHttp = substr($key, strlen("HTTP_"));
116+
$keyHyphenated = str_replace("_", "-", $keyWithoutHttp);
117+
self::assertEquals($value, $requestHeaders->get($keyHyphenated));
118+
}
119+
}
103120
}

0 commit comments

Comments
 (0)