|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
declare(strict_types=1); |
|
4
|
|
|
|
|
5
|
|
|
namespace RazonYang\Psr7\Swoole; |
|
6
|
|
|
|
|
7
|
|
|
use Nyholm\Psr7\ServerRequest; |
|
8
|
|
|
use Nyholm\Psr7\UploadedFile; |
|
9
|
|
|
use Nyholm\Psr7\Uri; |
|
10
|
|
|
use Psr\Http\Message\ServerRequestInterface; |
|
11
|
|
|
use Psr\Http\Message\UriInterface; |
|
12
|
|
|
use Swoole\Http\Request; |
|
13
|
|
|
|
|
14
|
|
|
final class ServerRequestFactory implements ServerRequestFactoryInterface |
|
15
|
|
|
{ |
|
16
|
4 |
|
public function create(Request $request): ServerRequestInterface |
|
17
|
|
|
{ |
|
18
|
4 |
|
$server = array_change_key_case($request->server, CASE_UPPER); |
|
19
|
4 |
|
$server['SCRIPT_NAME'] = $this->getScriptName(); |
|
20
|
4 |
|
$uri = $this->createUri($server); |
|
21
|
|
|
|
|
22
|
4 |
|
$headers = $request->header ?? []; |
|
23
|
|
|
|
|
24
|
4 |
|
$cookies = $request->cookie ?? []; |
|
25
|
4 |
|
if ($cookies) { |
|
26
|
1 |
|
$tmp = []; |
|
27
|
1 |
|
foreach ($cookies as $name => $value) { |
|
28
|
1 |
|
$tmp[] = sprintf('%s=%s', $name, $value); |
|
29
|
|
|
} |
|
30
|
1 |
|
$headers['cookie'] = implode('; ', $tmp); |
|
31
|
|
|
} |
|
32
|
|
|
|
|
33
|
4 |
|
$psrRequest = new ServerRequest( |
|
34
|
4 |
|
$request->getMethod(), |
|
|
|
|
|
|
35
|
|
|
$uri, |
|
36
|
|
|
$headers, |
|
37
|
4 |
|
$request->getContent(), |
|
38
|
4 |
|
$this->parseProtocolVersion($server), |
|
39
|
|
|
$server, |
|
40
|
|
|
); |
|
41
|
|
|
|
|
42
|
4 |
|
\parse_str($uri->getQuery(), $queryParams); |
|
43
|
|
|
|
|
44
|
4 |
|
$psrRequest = $psrRequest |
|
45
|
4 |
|
->withQueryParams($queryParams) |
|
46
|
4 |
|
->withCookieParams($cookies) |
|
47
|
4 |
|
->withUploadedFiles($this->parseUploadedFiles($request->files ?? [])); |
|
48
|
|
|
|
|
49
|
4 |
|
return $psrRequest; |
|
50
|
|
|
} |
|
51
|
|
|
|
|
52
|
4 |
|
private function getScriptName(): string |
|
53
|
|
|
{ |
|
54
|
|
|
global $argv; |
|
55
|
|
|
|
|
56
|
4 |
|
return $argv[0] ?? ''; |
|
57
|
|
|
} |
|
58
|
|
|
|
|
59
|
25 |
|
private function createUri(array $server): UriInterface |
|
60
|
|
|
{ |
|
61
|
25 |
|
$uri = new Uri(); |
|
62
|
|
|
|
|
63
|
25 |
|
if (!empty($server['HTTPS']) && $server['HTTPS'] !== 'off') { |
|
64
|
3 |
|
$uri = $uri->withScheme('https'); |
|
65
|
|
|
} else { |
|
66
|
22 |
|
$uri = $uri->withScheme('http'); |
|
67
|
|
|
} |
|
68
|
|
|
|
|
69
|
25 |
|
if (isset($server['SERVER_PORT'])) { |
|
70
|
2 |
|
$uri = $uri->withPort((int) $server['SERVER_PORT']); |
|
71
|
|
|
} else { |
|
72
|
23 |
|
$uri = $uri->withPort($uri->getScheme() === 'https' ? 443 : 80); |
|
73
|
|
|
} |
|
74
|
|
|
|
|
75
|
25 |
|
if (isset($server['HTTP_HOST'])) { |
|
76
|
4 |
|
$parts = explode(':', $server['HTTP_HOST']); |
|
77
|
4 |
|
$uri = count($parts) == 2 |
|
78
|
1 |
|
? $uri->withHost($parts[0]) |
|
79
|
1 |
|
->withPort((int) $parts[1]) |
|
80
|
3 |
|
: $uri->withHost($server['HTTP_HOST']); |
|
81
|
21 |
|
} elseif (isset($server['SERVER_NAME'])) { |
|
82
|
1 |
|
$uri = $uri->withHost($server['SERVER_NAME']); |
|
83
|
|
|
} |
|
84
|
|
|
|
|
85
|
25 |
|
if (isset($server['REQUEST_URI'])) { |
|
86
|
8 |
|
$uri = $uri->withPath($server['REQUEST_URI']); |
|
87
|
|
|
} |
|
88
|
|
|
|
|
89
|
25 |
|
if (isset($server['QUERY_STRING'])) { |
|
90
|
4 |
|
$uri = $uri->withQuery($server['QUERY_STRING']); |
|
91
|
|
|
} |
|
92
|
|
|
|
|
93
|
25 |
|
return $uri; |
|
94
|
|
|
} |
|
95
|
|
|
|
|
96
|
7 |
|
private function parseUploadedFiles(array $files): array |
|
97
|
|
|
{ |
|
98
|
7 |
|
$uploadedFiles = []; |
|
99
|
|
|
|
|
100
|
7 |
|
foreach ($files as $file) { |
|
101
|
3 |
|
$uploadedFiles[] = new UploadedFile( |
|
102
|
3 |
|
$file['tmp_name'], |
|
103
|
3 |
|
$file['size'], |
|
104
|
3 |
|
$file['error'], |
|
105
|
3 |
|
$file['name'], |
|
106
|
3 |
|
$file['type'], |
|
107
|
|
|
); |
|
108
|
|
|
} |
|
109
|
|
|
|
|
110
|
7 |
|
return $uploadedFiles; |
|
111
|
|
|
} |
|
112
|
|
|
|
|
113
|
8 |
|
private function parseProtocolVersion(array $server): string |
|
114
|
|
|
{ |
|
115
|
8 |
|
if (isset($server['SERVER_PROTOCOL']) && \strpos($server['SERVER_PROTOCOL'], 'HTTP/') === 0) { |
|
116
|
7 |
|
return \substr($server['SERVER_PROTOCOL'], 5); |
|
117
|
|
|
} |
|
118
|
|
|
|
|
119
|
1 |
|
return '1.1'; |
|
120
|
|
|
} |
|
121
|
|
|
} |
|
122
|
|
|
|