Skip to content

Commit e66a32b

Browse files
Izolexdg
authored andcommitted
RequestFactory: extract port from x-forwarded-host (#230)
1 parent 2c298b0 commit e66a32b

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed

src/Http/RequestFactory.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,14 @@ private function useNonstandardProxy(Url $url): ?string
347347

348348
if (isset($xForwardedForRealIpKey) && !empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
349349
$xForwardedHost = explode(',', $_SERVER['HTTP_X_FORWARDED_HOST']);
350-
if (isset($xForwardedHost[$xForwardedForRealIpKey])) {
351-
$url->setHost(trim($xForwardedHost[$xForwardedForRealIpKey]));
350+
if (
351+
isset($xForwardedHost[$xForwardedForRealIpKey])
352+
&& ($pair = $this->parseHostAndPort(trim($xForwardedHost[$xForwardedForRealIpKey])))
353+
) {
354+
$url->setHost($pair[0]);
355+
if (isset($pair[1])) {
356+
$url->setPort($pair[1]);
357+
}
352358
}
353359
}
354360

tests/Http/RequestFactory.proxy.x-forwarded.phpt

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,43 @@ test('', function () {
3131

3232
$url = $factory->fromGlobals()->getUrl();
3333
Assert::same('otherhost', $url->getHost());
34+
Assert::same(80, $url->getPort());
35+
});
36+
37+
test('', function () {
38+
$_SERVER = [
39+
'REMOTE_ADDR' => '127.0.0.3',
40+
'REMOTE_HOST' => 'localhost',
41+
'HTTP_X_FORWARDED_FOR' => '23.75.45.200',
42+
'HTTP_X_FORWARDED_HOST' => 'otherhost:8080',
43+
];
44+
45+
$factory = new RequestFactory;
46+
$factory->setProxy('127.0.0.3');
47+
Assert::same('23.75.45.200', $factory->fromGlobals()->getRemoteAddress());
48+
Assert::same('a23-75-45-200.deploy.static.akamaitechnologies.com', $factory->fromGlobals()->getRemoteHost());
49+
50+
$url = $factory->fromGlobals()->getUrl();
51+
Assert::same('otherhost', $url->getHost());
52+
Assert::same(8080, $url->getPort());
53+
});
54+
55+
test('', function () {
56+
$_SERVER = [
57+
'REMOTE_ADDR' => '127.0.0.3',
58+
'HTTP_X_FORWARDED_FOR' => '23.75.45.200',
59+
'HTTP_X_FORWARDED_HOST' => 'otherhost',
60+
'HTTP_X_FORWARDED_PROTO' => 'https',
61+
'HTTP_X_FORWARDED_PORT' => '8080',
62+
];
63+
64+
$factory = new RequestFactory;
65+
$factory->setProxy('127.0.0.3');
66+
67+
$url = $factory->fromGlobals()->getUrl();
68+
Assert::same('https', $url->getScheme());
69+
Assert::same('otherhost', $url->getHost());
70+
Assert::same(8080, $url->getPort());
3471
});
3572

3673
test('', function () {
@@ -45,10 +82,34 @@ test('', function () {
4582
$factory->setProxy('10.0.0.0/24');
4683
Assert::same('172.16.0.1', $factory->fromGlobals()->getRemoteAddress());
4784
Assert::same('172.16.0.1', $factory->fromGlobals()->getRemoteHost());
48-
Assert::same('real', $factory->fromGlobals()->getUrl()->getHost());
85+
86+
$url = $factory->fromGlobals()->getUrl();
87+
Assert::same('real', $url->getHost());
88+
Assert::same(80, $url->getPort());
4989

5090
$factory->setProxy(['10.0.0.1', '10.0.0.2']);
5191
Assert::same('172.16.0.1', $factory->fromGlobals()->getRemoteAddress());
5292
Assert::same('172.16.0.1', $factory->fromGlobals()->getRemoteHost());
53-
Assert::same('real', $factory->fromGlobals()->getUrl()->getHost());
93+
94+
$url = $factory->fromGlobals()->getUrl();
95+
Assert::same('real', $url->getHost());
96+
Assert::same(80, $url->getPort());
97+
});
98+
99+
test('', function () {
100+
$_SERVER = [
101+
'REMOTE_ADDR' => '10.0.0.2', //proxy2
102+
'REMOTE_HOST' => 'proxy2',
103+
'HTTP_X_FORWARDED_FOR' => '123.123.123.123, not-ip.com, 172.16.0.1, 10.0.0.1',
104+
'HTTP_X_FORWARDED_HOST' => 'fake, not-ip.com, real:8080, proxy1',
105+
];
106+
107+
$factory = new RequestFactory;
108+
$factory->setProxy(['10.0.0.1', '10.0.0.2']);
109+
Assert::same('172.16.0.1', $factory->fromGlobals()->getRemoteAddress());
110+
Assert::same('172.16.0.1', $factory->fromGlobals()->getRemoteHost());
111+
112+
$url = $factory->fromGlobals()->getUrl();
113+
Assert::same('real', $url->getHost());
114+
Assert::same(8080, $url->getPort());
54115
});

0 commit comments

Comments
 (0)