Failed Conditions
Pull Request — master (#2)
by Arnold
06:40
created

RequestConvertor::createStream()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
crap 1
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 1
        }
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 3
        ];
71
    }
72
    
73
    /**
74
     * Set the server request properties
75
     * 
76
     * @param ServerRequestInterface $baseRequest
77
     * @param BrowserKitRequest      $request
78
     * @param resource               $stream
79
     * @param string                 $uri
80
     * @param array                  $queryParams
81
     * @return ServerRequestInterface
82
     */
83 3
    protected function setRequestProperties(
84
        ServerRequestInterface $baseRequest,
85
        BrowserKitRequest $request,
86
        $stream,
87
        $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('')))
0 ignored issues
show
Bug introduced by
The method withScheme cannot be called on $uri (of type string).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
94 3
            ->withCookieParams($request->getCookies())
95 3
            ->withUri($uri)
0 ignored issues
show
Documentation introduced by
$uri is of type string, but the function expects a object<Psr\Http\Message\UriInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
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 1
        }
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 1
            } else {
122 2
                $fileObjects[$fieldName] = new UploadedFile($file);
123
            }
124 3
        }
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 3
        }
146
        
147 3
        return $this->setRequestProperties($baseRequest, $request, $stream, $uri, (array)$queryParams);
148
    }
149
}
150