1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
<?php
/**
* High-performance PHP process supervisor and load balancer written in Go
*
* @author Wolfy-J
*/
/**
* Class PSR7Worker serves PSR-7 requests and consume responses.
*/
class PSR7Worker
{
/**
* @var \Spiral\RoadRunner\Worker
*/
private $worker;
/**
* @param \Spiral\RoadRunner\Worker $worker
*/
public function __construct(\Spiral\RoadRunner\Worker $worker)
{
$this->worker = $worker;
}
/**
* @return \Spiral\RoadRunner\Worker
*/
public function getWorker(): \Spiral\RoadRunner\Worker
{
return $this->worker;
}
/**
* @return \Psr\Http\Message\ServerRequestInterface|null
*/
public function acceptRequest()
{
$body = $this->worker->receive($ctx);
if (empty($body) && empty($ctx)) {
// termination request
return null;
}
parse_str($ctx['rawQuery'], $query);
$body = 'php://input';
$parsedBody = null;
if ($ctx['parsed']) {
$parsedBody = json_decode($body, true);
} elseif ($body != null) {
$parsedBody = new \Zend\Diactoros\Stream("php://memory", "rwb");
$parsedBody->write($body);
}
return new \Zend\Diactoros\ServerRequest(
$_SERVER,
$this->wrapUploads($ctx['uploads']),
$ctx['uri'],
$ctx['method'],
$body,
$ctx['headers'],
$ctx['cookies'],
$query,
$parsedBody,
$ctx['protocol']
);
}
/**
* Send response to the application server.
*
* @param \Psr\Http\Message\ResponseInterface $response
*/
public function respond(\Psr\Http\Message\ResponseInterface $response)
{
$this->worker->error("asd");
$this->worker->send($response->getBody(), json_encode([
'status' => $response->getStatusCode(),
'headers' => $response->getHeaders()
]));
}
/**
* Wraps all uploaded files with UploadedFile.
*
* @param array $files
*
* @return array
*/
private function wrapUploads($files): array
{
if (empty($files)) {
return [];
}
$result = [];
foreach ($files as $index => $file) {
if (isset($file['name'])) {
$result[$index] = new \Zend\Diactoros\UploadedFile(
$file['tmpName'],
$file['size'],
$file['error'],
$file['name'],
$file['type']
);
continue;
}
$result[$index] = $this->wrapUploads($file);
}
return $result;
}
}
|