summaryrefslogtreecommitdiff
path: root/php-src/PSR7Worker.php
blob: 65225d8553a309e9a3235eea03ac6f823cac3b74 (plain)
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;
    }
}