RequestConvertor::convertUploadedFiles()   A
last analyzed

Complexity

Conditions 5
Paths 4

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 9
cts 9
cp 1
rs 9.4222
c 0
b 0
f 0
cc 5
nc 4
nop 1
crap 5
1
<?php
2
3
namespace Jasny\Codeception;
4
5
use Psr\Http\Message\ServerRequestInterface;
6
use Psr\Http\Message\UploadedFileInterface;
7
use Psr\Http\Message\UriInterface;
8
use Jasny\HttpMessage\ServerRequest;
9
use Jasny\HttpMessage\UploadedFile;
10
use Jasny\HttpMessage\Uri;
11
use Jasny\HttpMessage\Stream;
12
use Symfony\Component\BrowserKit\Request as BrowserKitRequest;
13
14
/**
15
 * Convert a codeception request to a Jasny PSR-7 server request
16
 */
17
class RequestConvertor
18
{
19
    /**
20
     * Create the output stream handle
21
     *
22
     * @param BrowserKitRequest $request
23
     * @return Stream
24
     */
25 4
    protected function createStream(BrowserKitRequest $request)
26
    {
27 4
        $stream = fopen('php://temp', 'a+');
28 4
        fwrite($stream, $request->getContent());
29
        
30 4
        return new Stream($stream);
31
    }
32
    
33
    /**
34
     * Build a full URI from a request
35
     *
36
     * @param BrowserKitRequest $request
37
     * @return array [Uri, queryParams]
38
     */
39 4
    protected function buildFullUri(BrowserKitRequest $request)
40
    {
41 4
        $uri = new Uri($request->getUri());
42
        
43 4
        $queryParams = [];
44 4
        parse_str($uri->getQuery(), $queryParams);
45
        
46 4
        if ($request->getMethod() === 'GET') {
47 2
            $queryParams = array_merge($queryParams, $request->getParameters());
48 2
            $uri = $uri->withQuery(http_build_query($queryParams));
49
        }
50
        
51 4
        return [$uri, $queryParams];
52
    }
53
54
    /**
55
     * Set the request headers
56
     *
57
     * @param ServerRequestInterface $baseRequest
58
     * @param array                  $params
59
     * @retrun ServerRequestInterface
60
     */
61 1
    protected function setRequestHeaders(ServerRequestInterface $baseRequest, array $params)
62
    {
63 1
        $headers = (new ServerRequest())->withServerParams($params)->getHeaders();
64 1
        $psrRequest = $baseRequest;
65
66 1
        foreach ($headers as $header => $values) {
67 1
            $psrRequest = $psrRequest->withHeader($header, $values);
68
        }
69
        
70 1
        return $psrRequest;
71
    }
72
73
    /**
74
     * Get additional server params from request.
75
     * @internal It would be nicer if this was solved by Jasny Http Message
76
     *
77
     * @param BrowserKitRequest $request
78
     * @param UriInterface      $uri
79
     * @param array             $queryParams
80
     * @return array
81
     */
82 3
    protected function determineServerParams(BrowserKitRequest $request, UriInterface $uri, array $queryParams)
83
    {
84
        return [
85 3
            'REQUEST_METHOD' => $request->getMethod(),
86 3
            'QUERY_STRING' => http_build_query($queryParams),
87 3
            'REQUEST_URI' => (string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo(''))
88
        ];
89
    }
90
    
91
    /**
92
     * Set the server request properties
93
     *
94
     * @param ServerRequestInterface $baseRequest
95
     * @param BrowserKitRequest      $request
96
     * @param Stream                 $stream
97
     * @param UriInterface           $uri
98
     * @param array                  $queryParams
99
     * @return ServerRequestInterface
100
     */
101 4
    protected function setRequestProperties(
102
        ServerRequestInterface $baseRequest,
103
        BrowserKitRequest $request,
104
        Stream $stream,
105
        UriInterface $uri,
106
        array $queryParams
107
    ) {
108
        return $baseRequest
109 4
            ->withProtocolVersion('1.1')
110 4
            ->withBody($stream)
111 4
            ->withMethod($request->getMethod())
112 4
            ->withRequestTarget((string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo('')))
113 4
            ->withCookieParams($request->getCookies())
114 4
            ->withUri($uri)
115 4
            ->withQueryParams($queryParams)
116 4
            ->withParsedBody($request->getMethod() !== 'GET' && !empty($request->getParameters())
117 4
                ? $request->getParameters() : null)
118 4
            ->withUploadedFiles($this->convertUploadedFiles($request->getFiles()));
119
    }
120
    
121
    /**
122
     * Convert a list of uploaded files to a Jasny PSR-7 uploaded files
123
     *
124
     * @param array $files
125
     * @return UploadedFile[]|array
126
     */
127 4
    protected function convertUploadedFiles(array $files)
128
    {
129 4
        $fileObjects = [];
130
        
131 4
        foreach ($files as $fieldName => $file) {
132 2
            if ($file instanceof UploadedFileInterface) {
133 1
                $fileObjects[$fieldName] = $file;
134 2
            } elseif (!isset($file['tmp_name']) && !isset($file['error'])) {
135 1
                $fileObjects[$fieldName] = $this->convertUploadedFiles($file);
136
            } else {
137 2
                $fileObjects[$fieldName] = new UploadedFile($file);
138
            }
139
        }
140
        
141 4
        return $fileObjects;
142
    }
143
144
    
145
    /**
146
     * Convert a codeception request to a PSR-7 server request
147
     *
148
     * @param BrowserKitRequest      $request
149
     * @param ServerRequestInterface $baseRequest
150
     * @return ServerRequest
151
     */
152 4
    public function convert(BrowserKitRequest $request, ServerRequestInterface $baseRequest)
153
    {
154 4
        $stream = $this->createStream($request);
155 4
        list($uri, $queryParams) = $this->buildFullUri($request);
156
        
157 4
        if ($baseRequest instanceof ServerRequest) {
158 3
            $serverParams = $this->determineServerParams($request, $uri, (array)$queryParams);
159 3
            $psrRequest = $baseRequest->withServerParams($request->getServer() + $serverParams);
160
        } else {
161 1
            $psrRequest = $this->setRequestHeaders($baseRequest, $request->getServer());
162
        }
163
        
164 4
        return $this->setRequestProperties($psrRequest, $request, $stream, $uri, (array)$queryParams);
165
    }
166
}
167