Completed
Pull Request — master (#9)
by
unknown
23:10
created

RequestTransformer::copyCookies()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 12
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 2
crap 3
1
<?php
2
3
namespace Pachico\SlimSwoole\Bridge;
4
5
use Slim\Http;
6
use swoole_http_request;
7
use Dflydev\FigCookies\Cookie;
8
use Dflydev\FigCookies\FigRequestCookies;
9
10
class RequestTransformer implements RequestTransformerInterface
11
{
12
    const DEFAULT_SCHEMA = 'http';
13
14
    /**
15
     * @param swoole_http_request $request
16
     *
17
     * @return Http\Request
18
     *
19 15
     * @todo Handle HTTPS requests
20
     */
21
    public function toSlim(swoole_http_request $request): Http\Request
22 15
    {
23 15
24 15
        $slimRequest = Http\Request::createFromEnvironment(
25 15
            new Http\Environment([
26 15
                    'SERVER_PROTOCOL' => $request->server['server_protocol'],
27 15
                    'REQUEST_METHOD' => $request->server['request_method'],
28 15
                    'REQUEST_SCHEME' => static::DEFAULT_SCHEMA,
29 15
                    'REQUEST_URI' => $request->server['request_uri'],
30 15
                    'QUERY_STRING' => isset($request->server['query_string']) ? $request->server['query_string'] : '',
31 15
                    'SERVER_PORT' => $request->server['server_port'],
32 15
                    'REMOTE_ADDR' => $request->server['remote_addr'],
33
                    'REQUEST_TIME' => $request->server['request_time'],
34
                    'REQUEST_TIME_FLOAT' => $request->server['request_time_float']
35
                    ])
36 15
        );
37
38 15
        $slimRequest = $this->copyHeaders($request, $slimRequest);
39 9
40
        if ($this->isMultiPartFormData($request) || $this->isXWwwFormUrlEncoded($request)) {
41
            $slimRequest = $this->handlePostData($request, $slimRequest);
42 15
        }
43 6
44
        if ($this->isMultiPartFormData($request)) {
45
            $slimRequest = $this->handleUploadedFiles($request, $slimRequest);
46 15
        }
47
48
        $slimRequest = $this->copyCookies($request, $slimRequest);
49
50
        return $this->copyBody($request, $slimRequest);
51
    }
52
53
    /**
54
     * @param swoole_http_request $request
55 15
     * @param Http\Request $slimRequest
56
     *
57 15
     * @return Http\Request
58 12
     */
59
    private function copyCookies(swoole_http_request $request, Http\Request $slimRequest): Http\Request
60
    {
61 3
        if (empty($request->cookie)) {
62 3
            return $slimRequest;
63 3
        }
64
65 3
        foreach ($request->cookie as $name => $value) {
66
            $cookie = Cookie::create($name, $value);
67
            $slimRequest = FigRequestCookies::set($slimRequest, $cookie);
68
        }
69
70
        return $slimRequest;
71
    }
72
73
    /**
74 15
     * @param swoole_http_request $request
75
     * @param Http\Request $slimRequest
76
     *
77 15
     * @return Http\Request
78 9
     */
79
    private function copyBody(swoole_http_request $request, Http\Request $slimRequest): Http\Request
80
    {
81 15
        if (empty($request->rawContent())) {
82
            return $slimRequest;
83
        }
84
85
        $body = $slimRequest->getBody();
86
        $body->write($request->rawContent());
87
        $body->rewind();
88
89 15
        return $slimRequest->withBody($body);
90
    }
91
92 15
    /**
93 15
     * @param swoole_http_request $request
94 9
     * @param Http\Request $slimRequest
95
     *
96
     * @return Http\Request
97 6
     */
98
    private function copyHeaders(swoole_http_request $request, Http\Request $slimRequest): Http\Request
99
    {
100
101
        foreach ($request->header as $key => $val) {
102
            $slimRequest = $slimRequest->withHeader($key, $val);
103
        }
104
105 9
        return $slimRequest;
106
    }
107
108 9
    /**
109 9
     * @param swoole_http_request $request
110 6
     *
111
     * @return boolean
112
     */
113 3
    private function isMultiPartFormData(swoole_http_request $request): bool
114
    {
115
116
        if (!isset($request->header['content-type'])
117
            || false === stripos($request->header['content-type'], 'multipart/form-data')) {
118
            return false;
119
        }
120
121
        return true;
122
    }
123 6
124
    /**
125 6
     * @param swoole_http_request $request
126 3
     *
127
     * @return boolean
128
     */
129 3
    private function isXWwwFormUrlEncoded(swoole_http_request $request): bool
130
    {
131 3
132 3
        if (!isset($request->header['content-type'])
133 3
            || false === stripos($request->header['content-type'], 'application/x-www-form-urlencoded')) {
134 3
            return false;
135 3
        }
136 3
137 3
        return true;
138
    }
139
140
141 3
    /**
142
     * @param swoole_http_request $request
143
     * @param Http\Request $slimRequest
144
     *
145
     * @return Http\Request
146
     */
147
    private function handleUploadedFiles(swoole_http_request $request, Http\Request $slimRequest): Http\Request
148
    {
149
        if (empty($request->files) || !is_array($request->files)) {
150 9
            return $slimRequest;
151
        }
152 9
153 3
        $uploadedFiles = [];
154
155
        foreach ($request->files as $key => $file) {
156 6
            $uploadedFiles[$key] = new Http\UploadedFile(
157
                $file['tmp_name'],
158
                $file['name'],
159
                $file['type'],
160
                $file['size'],
161
                $file['error']
162
            );
163
        }
164
165
        return $slimRequest->withUploadedFiles($uploadedFiles);
166
    }
167
168
    /**
169
     * @param swoole_http_request $swooleRequest
170
     * @param Http\Request $slimRequest
171
     *
172
     * @return Http\Request
173
     */
174
    private function handlePostData(swoole_http_request $swooleRequest, Http\Request $slimRequest): Http\Request
175
    {
176
        if (empty($swooleRequest->post) || !is_array($swooleRequest->post)) {
177
            return $slimRequest;
178
        }
179
180
        return $slimRequest->withParsedBody($swooleRequest->post);
181
    }
182
}
183