Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
12 | class IpAddressTest extends NimoTestCase |
||
13 | { |
||
14 | 1 | public function testIpSetByRemoteAddr() |
|
15 | { |
||
16 | 1 | $middleware = new IpAddress(); |
|
17 | |||
18 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
19 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
20 | ]); |
||
21 | 1 | $this->runRequest($middleware, $request); |
|
22 | |||
23 | 1 | Assert::assertSame('192.168.1.1', $middleware->getIpAddress()); |
|
24 | 1 | } |
|
25 | |||
26 | 1 | public function testIpIsNullIfMissing() |
|
27 | { |
||
28 | 1 | $middleware = new IpAddress(); |
|
29 | |||
30 | 1 | $request = ServerRequestFactory::fromGlobals(); |
|
31 | 1 | $this->runRequest($middleware, $request); |
|
32 | |||
33 | |||
34 | 1 | Assert::assertNull($middleware->getIpAddress()); |
|
35 | 1 | } |
|
36 | |||
37 | 1 | public function testXForwardedForIp() |
|
38 | { |
||
39 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
40 | |||
41 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
42 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
43 | 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1' |
||
44 | ]); |
||
45 | 1 | $this->runRequest($middleware, $request); |
|
46 | |||
47 | 1 | Assert::assertSame('192.168.1.3', $middleware->getIpAddress()); |
|
48 | 1 | } |
|
49 | |||
50 | 1 | public function testProxyIpIsIgnored() |
|
51 | { |
||
52 | 1 | $middleware = new IpAddress(); |
|
53 | |||
54 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
55 | 1 | 'REMOTE_ADDR' => '192.168.0.1', |
|
56 | 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1' |
||
57 | ]); |
||
58 | 1 | $this->runRequest($middleware, $request); |
|
59 | |||
60 | 1 | Assert::assertSame('192.168.0.1', $middleware->getIpAddress()); |
|
61 | 1 | } |
|
62 | |||
63 | 1 | public function testHttpClientIp() |
|
64 | { |
||
65 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
66 | |||
67 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
68 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
69 | 'HTTP_CLIENT_IP' => '192.168.1.3' |
||
70 | ]); |
||
71 | 1 | $this->runRequest($middleware, $request); |
|
72 | |||
73 | 1 | Assert::assertSame('192.168.1.3', $middleware->getIpAddress()); |
|
74 | 1 | } |
|
75 | |||
76 | 1 | public function testXForwardedForIpV6() |
|
77 | { |
||
78 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
79 | |||
80 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
81 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
82 | 'HTTP_X_FORWARDED_FOR' => '001:DB8::21f:5bff:febf:ce22:8a2e' |
||
83 | ]); |
||
84 | 1 | $this->runRequest($middleware, $request); |
|
85 | |||
86 | 1 | Assert::assertSame('001:DB8::21f:5bff:febf:ce22:8a2e', $middleware->getIpAddress()); |
|
87 | 1 | } |
|
88 | |||
89 | 1 | public function testXForwardedForWithInvalidIp() |
|
90 | { |
||
91 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
92 | |||
93 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
94 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
95 | 'HTTP_X_FORWARDED_FOR' => 'foo-bar' |
||
96 | ]); |
||
97 | 1 | $this->runRequest($middleware, $request); |
|
98 | |||
99 | 1 | Assert::assertSame('192.168.1.1', $middleware->getIpAddress()); |
|
100 | 1 | } |
|
101 | |||
102 | 1 | public function testXForwardedForIpWithTrustedProxy() |
|
103 | { |
||
104 | 1 | $middleware = new IpAddress(['192.168.0.1', '192.168.0.2']); |
|
105 | |||
106 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
107 | 1 | 'REMOTE_ADDR' => '192.168.0.2', |
|
108 | 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1' |
||
109 | ]); |
||
110 | 1 | $this->runRequest($middleware, $request); |
|
111 | |||
112 | 1 | Assert::assertSame('192.168.1.3', $middleware->getIpAddress()); |
|
113 | 1 | } |
|
114 | |||
115 | 1 | public function testXForwardedForIpWithUntrustedProxy() |
|
116 | { |
||
117 | 1 | $middleware = new IpAddress(['192.168.0.1']); |
|
118 | |||
119 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
120 | 1 | 'REMOTE_ADDR' => '192.168.0.2', |
|
121 | 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1' |
||
122 | ]); |
||
123 | 1 | $this->runRequest($middleware, $request); |
|
124 | |||
125 | 1 | Assert::assertSame('192.168.0.2', $middleware->getIpAddress()); |
|
126 | 1 | } |
|
127 | |||
128 | 1 | public function testForwardedWithMultipleFor() |
|
129 | { |
||
130 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
131 | |||
132 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
133 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
134 | 'HTTP_FORWARDED' => 'for=192.0.2.43, for=198.51.100.17;by=203.0.113.60;proto=http;host=example.com', |
||
135 | ]); |
||
136 | 1 | $this->runRequest($middleware, $request); |
|
137 | |||
138 | 1 | Assert::assertSame('192.0.2.43', $middleware->getIpAddress()); |
|
139 | 1 | } |
|
140 | |||
141 | 1 | public function testForwardedWithAllOptions() |
|
142 | { |
||
143 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
144 | |||
145 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
146 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
147 | 'HTTP_FORWARDED' => 'for=192.0.2.60; proto=http;by=203.0.113.43; host=_hiddenProxy, for=192.0.2.61', |
||
148 | ]); |
||
149 | 1 | $this->runRequest($middleware, $request); |
|
150 | |||
151 | 1 | Assert::assertSame('192.0.2.60', $middleware->getIpAddress()); |
|
152 | 1 | } |
|
153 | |||
154 | 1 | public function testForwardedWithWithIpV6() |
|
155 | { |
||
156 | 1 | $middleware = new IpAddress(['192.168.1.1']); |
|
157 | |||
158 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
159 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
160 | 'HTTP_FORWARDED' => 'For="[2001:db8:cafe::17]:4711", for=_internalProxy', |
||
161 | ]); |
||
162 | 1 | $this->runRequest($middleware, $request); |
|
163 | |||
164 | 1 | Assert::assertSame('2001:db8:cafe::17', $middleware->getIpAddress()); |
|
165 | 1 | } |
|
166 | |||
167 | 1 | public function testCustomHeader() |
|
168 | { |
||
169 | $headersToInspect = [ |
||
170 | 1 | 'Foo-Bar' |
|
171 | ]; |
||
172 | 1 | $middleware = new IpAddress(['192.168.1.1'], $headersToInspect); |
|
173 | |||
174 | 1 | $request = ServerRequestFactory::fromGlobals([ |
|
175 | 1 | 'REMOTE_ADDR' => '192.168.1.1', |
|
176 | ]); |
||
177 | 1 | $request = $request->withAddedHeader('Foo-Bar', '192.168.1.3'); |
|
178 | 1 | $this->runRequest($middleware, $request); |
|
179 | |||
180 | 1 | Assert::assertSame('192.168.1.3', $middleware->getIpAddress()); |
|
181 | 1 | } |
|
182 | |||
183 | /** |
||
184 | * @param $middleware |
||
185 | * @param $request |
||
186 | */ |
||
187 | 13 | protected function runRequest(IpAddress $middleware, ServerRequestInterface $request): void |
|
188 | { |
||
189 | 13 | $response = $this->getResponseMock(); |
|
190 | 13 | $handler = CallableHandler::wrap(function (ServerRequestInterface $request) use ($response, $middleware) { |
|
191 | 13 | $actualMiddleware = IpAddress::fromRequest($request); |
|
192 | 13 | Assert::assertSame($middleware, $actualMiddleware); |
|
193 | |||
194 | 13 | return $response; |
|
195 | 13 | }); |
|
196 | 13 | $acturlResponse = $middleware->process($request, $handler); |
|
197 | 13 | Assert::assertSame($response, $acturlResponse); |
|
198 | 13 | } |
|
199 | } |
||
200 |