Completed
Push — master ( e91cdf...4daf57 )
by Arnold
9s
created

RequestConvertor::convertUploadedFiles()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 16
Code Lines 10

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 8.8571
c 0
b 0
f 0
cc 5
eloc 10
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 resource
24
     */
25 3
    protected function createStream(BrowserKitRequest $request)
26
    {
27 3
        $stream = fopen('php://temp', 'r+');
28 3
        fwrite($stream, $request->getContent());
29 3
        fseek($stream, 0);
30
        
31 3
        return $stream;
32
    }
33
    
34
    /**
35
     * Build a full URI from a request
36
     * 
37
     * @param BrowserKitRequest $request
38
     * @return array [Uri, queryParams]
39
     */
40 3
    protected function buildFullUri(BrowserKitRequest $request)
41
    {
42 3
        $uri = new Uri($request->getUri());
43
        
44 3
        $queryParams = [];
45 3
        parse_str($uri->getQuery(), $queryParams);
46
        
47 3
        if ($request->getMethod() === 'GET') {
48 1
            $queryParams = array_merge($queryParams, $request->getParameters());
49 1
            $uri = $uri->withQuery(http_build_query($queryParams));
50
        }
51
        
52 3
        return [$uri, $queryParams];
53
    }
54
    
55
    /**
56
     * Get additional server params from request.
57
     * @internal It would be nicer if this was solved by Jasny Http Message
58
     * 
59
     * @param BrowserKitRequest $request
60
     * @param UriInterface      $uri
61
     * @param array             $queryParams
62
     * @return array
63
     */
64 3
    protected function determineServerParams(BrowserKitRequest $request, UriInterface $uri, array $queryParams)
65
    {
66
        return [
67 3
            'REQUEST_METHOD' => $request->getMethod(),
68 3
            'QUERY_STRING' => http_build_query($queryParams),
69 3
            'REQUEST_URI' => (string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo(''))
70
        ];
71
    }
72
    
73
    /**
74
     * Set the server request properties
75
     * 
76
     * @param ServerRequestInterface $baseRequest
77
     * @param BrowserKitRequest      $request
78
     * @param resource               $stream
79
     * @param UriInterface           $uri
80
     * @param array                  $queryParams
81
     * @return ServerRequestInterface
82
     */
83 3
    protected function setRequestProperties(
84
        ServerRequestInterface $baseRequest,
85
        BrowserKitRequest $request,
86
        $stream,
87
        UriInterface $uri,
88
        array $queryParams
89
    ) {
90
        $psrRequest = $baseRequest
91 3
            ->withBody(new Stream($stream))
92 3
            ->withMethod($request->getMethod())
93 3
            ->withRequestTarget((string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo('')))
94 3
            ->withCookieParams($request->getCookies())
95 3
            ->withUri($uri)
96 3
            ->withQueryParams((array)$queryParams)
97 3
            ->withUploadedFiles($this->convertUploadedFiles($request->getFiles()));
98
        
99 3
        if ($request->getMethod() !== 'GET' && !empty($request->getParameters())) {
100 1
            $psrRequest = $psrRequest->withParsedBody($request->getParameters());
101
        }
102
        
103 3
        return $psrRequest;
104
    }
105
    
106
    /**
107
     * Convert a list of uploaded files to a Jasny PSR-7 uploaded files
108
     * 
109
     * @param array $files
110
     * @return UploadedFile[]|array
111
     */
112 3
    protected function convertUploadedFiles(array $files)
113
    {
114 3
        $fileObjects = [];
115
        
116 3
        foreach ($files as $fieldName => $file) {
117 2
            if ($file instanceof UploadedFileInterface) {
118 1
                $fileObjects[$fieldName] = $file;
119 2
            } elseif (!isset($file['tmp_name']) && !isset($file['error'])) {
120 1
                $fileObjects[$fieldName] = $this->convertUploadedFiles($file);
121
            } else {
122 2
                $fileObjects[$fieldName] = new UploadedFile($file);
123
            }
124
        }
125
        
126 3
        return $fileObjects;
127
    }
128
129
    
130
    /**
131
     * Convert a codeception request to a PSR-7 server request
132
     * 
133
     * @param BrowserKitRequest      $request
134
     * @param ServerRequestInterface $baseRequest
135
     * @return ServerRequest
136
     */
137 3
    public function convert(BrowserKitRequest $request, ServerRequestInterface $baseRequest)
138
    {
139 3
        $stream = $this->createStream($request);
140 3
        list($uri, $queryParams) = $this->buildFullUri($request);
141
        
142 3
        if ($baseRequest instanceof ServerRequest) {
143 3
            $serverParams = $this->determineServerParams($request, $uri, (array)$queryParams);
144 3
            $baseRequest = $baseRequest->withServerParams($request->getServer() + $serverParams);
145
        }
146
        
147 3
        return $this->setRequestProperties($baseRequest, $request, $stream, $uri, (array)$queryParams);
148
    }
149
}
150