Completed
Pull Request — master (#7)
by
unknown
23:17
created

RequestTransformer::copyCookies()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

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