Skip to content

Commit f404579

Browse files
authored
Merge pull request #201 from clue-labs/connect-without-host
Fix parsing CONNECT request without Host header
2 parents 26f1025 + 7b05038 commit f404579

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

src/RequestHeaderParser.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private function parseRequest($data)
7777
// check this is a valid authority-form request-target (host:port)
7878
if (isset($uri['scheme'], $uri['host'], $uri['port']) && count($uri) === 3) {
7979
$originalTarget = $parts[1];
80-
$parts[1] = '/';
80+
$parts[1] = 'http://' . $parts[1] . '/';
8181
$headers = implode(' ', $parts);
8282
} else {
8383
throw new \InvalidArgumentException('CONNECT method MUST use authority-form request target');
@@ -135,16 +135,8 @@ private function parseRequest($data)
135135

136136
// re-apply actual request target from above
137137
if ($originalTarget !== null) {
138-
$uri = $request->getUri()->withPath('');
139-
140-
// re-apply host and port from request-target if given
141-
$parts = parse_url('tcp://' . $originalTarget);
142-
if (isset($parts['host'], $parts['port'])) {
143-
$uri = $uri->withHost($parts['host'])->withPort($parts['port']);
144-
}
145-
146138
$request = $request->withUri(
147-
$uri,
139+
$request->getUri()->withPath(''),
148140
true
149141
)->withRequestTarget($originalTarget);
150142
}

tests/ServerTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,29 @@ public function testRequestConnectAuthorityForm()
225225
$this->assertSame('example.com:443', $requestAssertion->getHeaderLine('Host'));
226226
}
227227

228+
public function testRequestConnectWithoutHostWillBeAdded()
229+
{
230+
$requestAssertion = null;
231+
$server = new Server(function (ServerRequestInterface $request) use (&$requestAssertion) {
232+
$requestAssertion = $request;
233+
return new Response();
234+
});
235+
236+
$server->listen($this->socket);
237+
$this->socket->emit('connection', array($this->connection));
238+
239+
$data = "CONNECT example.com:443 HTTP/1.1\r\n\r\n";
240+
$this->connection->emit('data', array($data));
241+
242+
$this->assertInstanceOf('RingCentral\Psr7\Request', $requestAssertion);
243+
$this->assertSame('CONNECT', $requestAssertion->getMethod());
244+
$this->assertSame('example.com:443', $requestAssertion->getRequestTarget());
245+
$this->assertSame('', $requestAssertion->getUri()->getPath());
246+
$this->assertSame('http://example.com:443', (string)$requestAssertion->getUri());
247+
$this->assertSame(443, $requestAssertion->getUri()->getPort());
248+
$this->assertSame('example.com:443', $requestAssertion->getHeaderLine('Host'));
249+
}
250+
228251
public function testRequestConnectAuthorityFormWithDefaultPortWillBeIgnored()
229252
{
230253
$requestAssertion = null;

0 commit comments

Comments
 (0)