11
11
use Nette \Http \UrlScript ;
12
12
use Psr \Http \Message \ServerRequestInterface ;
13
13
use Psr \Http \Message \UploadedFileInterface ;
14
- use Psr \Http \Message \UriInterface ;
15
14
16
- /**
17
- * TODO: Polish this a bit more, this is just ugly code to make this works
18
- */
19
15
class RequestFactory
20
16
{
21
17
/** @var string[] */
22
18
private array $ proxies = [];
23
- private static ServerRequestInterface $ request ;
24
19
25
20
/** @param string[] $proxies */
26
21
public function setProxy (array $ proxies ): void
27
22
{
28
23
$ this ->proxies = $ proxies ;
29
24
}
30
25
31
- public static function setRequest (ServerRequestInterface $ request ): void
26
+ public function getRequest (ServerRequestInterface $ request ): Request
32
27
{
33
- self ::$ request = $ request ;
34
- }
35
-
36
- public static function fromRequest (ServerRequestInterface $ request = null ): Request
37
- {
38
- return (new RequestFactory ())->fromPsr ($ request ?: self ::$ request );
39
- }
40
-
41
- public function fromPsr (ServerRequestInterface $ request ): Request
42
- {
43
- $ uri = $ request ->getUri ();
44
- $ url = $ this ->createUrlFromRequest ($ request );
45
- $ url ->setQuery ($ uri ->getQuery ());
46
-
47
- $ this ->setAuthorization ($ url , $ uri );
28
+ $ url = $ this ->createUrl ($ request );
48
29
49
- [$ remoteAddr , $ remoteHost ] = $ this ->resolveClientAttributes ($ request , $ url );
30
+ [$ remoteAddr , $ remoteHost ] = $ this ->resolveClientAttributes ($ url , $ request );
50
31
51
32
return new Request (
52
- new UrlScript ($ url , $ this ->getScriptPath ($ url )),
53
- ( array ) $ request -> getParsedBody ( ),
54
- $ this ->mapUploadedFiles ($ request-> getUploadedFiles () ),
33
+ new UrlScript ($ url , $ this ->getScriptPath ($ url, $ request )),
34
+ $ this -> getPost ( $ request ),
35
+ $ this ->getUploadedFiles ($ request ),
55
36
$ request ->getCookieParams (),
56
- $ this ->mapHeaders ($ request-> getHeaders () ),
37
+ $ this ->getHeaders ($ request ),
57
38
$ request ->getMethod (),
58
39
$ remoteAddr ,
59
40
$ remoteHost ,
60
- fn (): string => (string )$ request ->getBody ()
41
+ fn (): string => (string ) $ request ->getBody ()
61
42
);
62
43
}
63
44
64
- private function getScriptPath (Url $ url ): string
45
+ private function getScriptPath (Url $ url, ServerRequestInterface $ request ): string
65
46
{
66
47
$ path = $ url ->getPath ();
67
48
$ lpath = strtolower ($ path );
68
- $ script = strtolower ($ _SERVER ['SCRIPT_NAME ' ] ?? '' );
49
+ $ script = strtolower ($ request -> getServerParams () ['SCRIPT_NAME ' ] ?? '' );
69
50
if ($ lpath !== $ script ) {
70
51
$ max = min (strlen ($ lpath ), strlen ($ script ));
71
52
for ($ i = 0 ; $ i < $ max && $ lpath [$ i ] === $ script [$ i ]; $ i ++) ;
@@ -79,15 +60,18 @@ private function getScriptPath(Url $url): string
79
60
/**
80
61
* @return string[]
81
62
*/
82
- private function resolveClientAttributes (ServerRequestInterface $ request , Url $ url ): array
63
+ private function resolveClientAttributes (Url $ url , ServerRequestInterface $ request ): array
83
64
{
84
65
$ serverParams = $ request ->getServerParams ();
66
+
85
67
$ remoteAddr = $ serverParams ['REMOTE_ADDR ' ] ?? ($ request ->getHeader ('REMOTE_ADDR ' )[0 ] ?? null );
86
68
$ remoteHost = $ serverParams ['REMOTE_HOST ' ] ?? ($ request ->getHeader ('REMOTE_HOST ' )[0 ] ?? null );
87
69
88
- $ usingTrustedProxy = $ remoteAddr && !empty (array_filter ($ this ->proxies , function (string $ proxy ) use ($ remoteAddr ): bool {
89
- return Helpers::ipMatch ($ remoteAddr , $ proxy );
90
- }));
70
+ $ usingTrustedProxy = $ remoteAddr
71
+ && !empty (array_filter (
72
+ $ this ->proxies ,
73
+ fn (string $ proxy ): bool => Helpers::ipMatch ($ remoteAddr , $ proxy )
74
+ ));
91
75
92
76
if ($ usingTrustedProxy ) {
93
77
[$ remoteAddr , $ remoteHost ] = empty ($ request ->getHeader ('HTTP_FORWARDED ' ))
@@ -159,7 +143,9 @@ private function useNonstandardProxy(
159
143
): array {
160
144
161
145
if (isset ($ request ->getHeader ('HTTP_X_FORWARDED_PROTO ' )[0 ])) {
162
- $ url ->setScheme (strcasecmp ($ request ->getHeader ('HTTP_X_FORWARDED_PROTO ' )[0 ], 'https ' ) === 0 ? 'https ' : 'http ' );
146
+ $ url ->setScheme (
147
+ strcasecmp ($ request ->getHeader ('HTTP_X_FORWARDED_PROTO ' )[0 ], 'https ' ) === 0 ? 'https ' : 'http '
148
+ );
163
149
$ url ->setPort ($ url ->getScheme () === 'https ' ? 443 : 80 );
164
150
}
165
151
@@ -172,7 +158,8 @@ private function useNonstandardProxy(
172
158
$ request ->getHeader ('HTTP_X_FORWARDED_FOR ' ),
173
159
function (string $ ip ): bool {
174
160
return !array_filter ($ this ->proxies , function (string $ proxy ) use ($ ip ): bool {
175
- return filter_var (trim ($ ip ), FILTER_VALIDATE_IP ) !== false && Helpers::ipMatch (trim ($ ip ), $ proxy );
161
+ return filter_var (trim ($ ip ), FILTER_VALIDATE_IP ) !== false
162
+ && Helpers::ipMatch (trim ($ ip ), $ proxy );
176
163
});
177
164
}
178
165
);
@@ -193,25 +180,9 @@ function (string $ip): bool {
193
180
return [$ remoteAddr , $ remoteHost ];
194
181
}
195
182
196
- private function createUrlFromRequest ( ServerRequestInterface $ request ): Url
183
+ private function setAuthorization ( Url $ url , string $ user ): void
197
184
{
198
- $ url = new Url ;
199
- $ uri = $ request ->getUri ();
200
-
201
- $ url ->setScheme ($ uri ->getScheme ());
202
- $ url ->setHost ($ uri ->getHost ());
203
- $ url ->setPort ($ uri ->getPort ());
204
- $ url ->setPath ($ uri ->getPath ());
205
- $ url ->setQuery ($ uri ->getQuery ());
206
-
207
- return $ url ;
208
- }
209
-
210
- private function setAuthorization (Url $ url , UriInterface $ uri ): void
211
- {
212
- $ user = $ uri ->getUserInfo ();
213
185
$ pass = '' ;
214
-
215
186
if (str_contains ($ user , ': ' )) {
216
187
[$ user , $ pass ] = explode (': ' , $ user , 2 );
217
188
}
@@ -221,25 +192,50 @@ private function setAuthorization(Url $url, UriInterface $uri): void
221
192
}
222
193
223
194
/**
224
- * @param array<string, string[]> $headers
225
195
* @return array<string, string>
226
196
*/
227
- private function mapHeaders ( array $ headers ): array
197
+ private function getHeaders ( ServerRequestInterface $ request ): array
228
198
{
229
- return array_map (static fn (array $ header ) => implode ("\n" , $ header ), $ headers );
199
+ return array_map (
200
+ static fn (array $ header ) => implode ("\n" , $ header ),
201
+ $ request ->getHeaders ()
202
+ );
230
203
}
231
204
232
205
/**
233
- * @param UploadedFileInterface[] $uploadedFiles
234
206
* @return FileUpload[]
235
207
*/
236
- private function mapUploadedFiles ( array $ uploadedFiles ): array
208
+ private function getUploadedFiles ( ServerRequestInterface $ request ): array
237
209
{
238
210
return array_map (static fn (UploadedFileInterface $ file ) => new FileUpload ([
239
211
'name ' => $ file ->getClientFilename (),
240
212
'size ' => $ file ->getSize (),
241
213
'error ' => $ file ->getError (),
242
214
'tmpName ' => $ file ->getStream ()->getMetadata ('uri ' ),
243
- ]), $ uploadedFiles );
215
+ ]), $ request ->getUploadedFiles ());
216
+ }
217
+
218
+ /**
219
+ * @return array<string, mixed>
220
+ */
221
+ private function getPost (ServerRequestInterface $ request ): array
222
+ {
223
+ return (array ) $ request ->getParsedBody ();
224
+ }
225
+
226
+ private function createUrl (ServerRequestInterface $ request ): Url
227
+ {
228
+ $ url = new Url ;
229
+ $ uri = $ request ->getUri ();
230
+
231
+ $ url ->setScheme ($ uri ->getScheme ());
232
+ $ url ->setHost ($ uri ->getHost ());
233
+ $ url ->setPort ($ uri ->getPort ());
234
+ $ url ->setPath ($ uri ->getPath ());
235
+ $ url ->setQuery ($ uri ->getQuery ());
236
+
237
+ $ this ->setAuthorization ($ url , $ uri ->getUserInfo ());
238
+
239
+ return $ url ;
244
240
}
245
241
}
0 commit comments