Completed
Pull Request — master (#7)
by
unknown
02:37
created

RequestTransformer::copyCookies()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 11
ccs 6
cts 6
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)) return $slimRequest;
62
63 3
        foreach($request->cookie as $name => $value)
64
        {
65 3
            $cookie = Cookie::create($name, $value);
66 3
            $slimRequest = FigRequestCookies::set($slimRequest, $cookie);
67
        }
68
69 3
        return $slimRequest;
70
    }
71
72
    /**
73
     * @param swoole_http_request $request
74
     * @param Http\Request $slimRequest
75
     *
76
     * @return Http\Request
77
     */
78 18
    private function copyBody(swoole_http_request $request, Http\Request $slimRequest): Http\Request
79
    {
80 18
        if (empty($request->rawContent())) {
81 15
            return $slimRequest;
82
        }
83
84 3
        $body = $slimRequest->getBody();
85 3
        $body->write($request->rawContent());
86 3
        $body->rewind();
87
88 3
        return $slimRequest->withBody($body);
89
    }
90
91
    /**
92
     * @param swoole_http_request $request
93
     * @param Http\Request $slimRequest
94
     *
95
     * @return Http\Request
96
     */
97 18
    private function copyHeaders(swoole_http_request $request, Http\Request $slimRequest): Http\Request
98
    {
99
100 18
        foreach ($request->header as $key => $val) {
101 9
            $slimRequest = $slimRequest->withHeader($key, $val);
102
        }
103
104 18
        return $slimRequest;
105
    }
106
107
    /**
108
     * @param swoole_http_request $request
109
     *
110
     * @return boolean
111
     */
112 18
    private function isMultiPartFormData(swoole_http_request $request): bool
113
    {
114
115 18
        if (!isset($request->header['content-type'])
116 18
            || false === stripos($request->header['content-type'], 'multipart/form-data')) {
117 12
            return false;
118
        }
119
120 6
        return true;
121
    }
122
123
    /**
124
     * @param swoole_http_request $request
125
     *
126
     * @return boolean
127
     */
128 12
    private function isXWwwFormUrlEncoded(swoole_http_request $request): bool
129
    {
130
131 12
        if (!isset($request->header['content-type'])
132 12
            || false === stripos($request->header['content-type'], 'application/x-www-form-urlencoded')) {
133 9
            return false;
134
        }
135
136 3
        return true;
137
    }
138
139
140
    /**
141
     * @param swoole_http_request $request
142
     * @param Http\Request $slimRequest
143
     *
144
     * @return Http\Request
145
     */
146 6
    private function handleUploadedFiles(swoole_http_request $request, Http\Request $slimRequest): Http\Request
147
    {
148 6
        if (empty($request->files) || !is_array($request->files)) {
149 3
            return $slimRequest;
150
        }
151
152 3
        $uploadedFiles = [];
153
154 3
        foreach ($request->files as $key => $file) {
155 3
            $uploadedFiles[$key] = new Http\UploadedFile(
156 3
                $file['tmp_name'],
157 3
                $file['name'],
158 3
                $file['type'],
159 3
                $file['size'],
160 3
                $file['error']
161
            );
162
        }
163
164 3
        return $slimRequest->withUploadedFiles($uploadedFiles);
165
    }
166
167
    /**
168
     * @param swoole_http_request $swooleRequest
169
     * @param Http\Request $slimRequest
170
     *
171
     * @return Http\Request
172
     */
173 9
    private function handlePostData(swoole_http_request $swooleRequest, Http\Request $slimRequest): Http\Request
174
    {
175 9
        if (empty($swooleRequest->post) || !is_array($swooleRequest->post)) {
176 3
            return $slimRequest;
177
        }
178
179 6
        return $slimRequest->withParsedBody($swooleRequest->post);
180
    }
181
}
182