Completed
Pull Request — master (#5)
by Arnold
10:09
created

RequestConvertor::setRequestHeaders()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

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