Completed
Push — master ( 314781...743667 )
by Mariano
02:30
created

RequestTransformer::copyCookies()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

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