5
5
namespace DoclerLabs \CodeceptionSlimModule \Lib \Connector ;
6
6
7
7
use Psr \Http \Message \UploadedFileInterface ;
8
- use RuntimeException ;
9
8
use Slim \App ;
10
- use Slim \Http \Cookies ;
11
- use Slim \Http \Environment ;
12
- use Slim \Http \Headers ;
13
- use Slim \Http \Request ;
14
- use Slim \Http \RequestBody ;
15
- use Slim \Http \Response ;
16
- use Slim \Http \Stream ;
17
- use Slim \Http \UploadedFile ;
18
- use Slim \Http \Uri ;
9
+ use Slim \Psr7 \Cookies ;
10
+ use Slim \Psr7 \Factory \StreamFactory ;
11
+ use Slim \Psr7 \Factory \UriFactory ;
12
+ use Slim \Psr7 \Headers ;
13
+ use Slim \Psr7 \Request ;
14
+ use Slim \Psr7 \UploadedFile ;
19
15
use Symfony \Component \BrowserKit \AbstractBrowser ;
20
16
use Symfony \Component \BrowserKit \Request as BrowserKitRequest ;
21
17
use Symfony \Component \BrowserKit \Response as BrowserKitResponse ;
22
18
23
- class Slim extends AbstractBrowser
19
+ class SlimPsr7 extends AbstractBrowser
24
20
{
25
21
/** @var App */
26
22
private $ app ;
@@ -37,17 +33,8 @@ public function setApp(App $app): void
37
33
*/
38
34
protected function doRequest ($ request ): BrowserKitResponse
39
35
{
40
- $ slimRequest = $ this ->convertRequest ($ request );
41
-
42
- $ stream = fopen ('php://temp ' , 'wb+ ' );
43
- if ($ stream === false ) {
44
- throw new RuntimeException ('Could not open `php://temp` stream. ' );
45
- }
46
-
47
- $ headers = new Headers (['Content-Type ' => 'text/html; charset=UTF-8 ' ]);
48
- $ body = new Stream ($ stream );
49
- $ slimResponse = new Response (200 , $ headers , $ body );
50
- $ slimResponse = $ this ->app ->process ($ slimRequest , $ slimResponse );
36
+ $ slimRequest = $ this ->convertRequest ($ request );
37
+ $ slimResponse = $ this ->app ->handle ($ slimRequest );
51
38
52
39
return new BrowserKitResponse (
53
40
(string )$ slimResponse ->getBody (),
@@ -58,33 +45,20 @@ protected function doRequest($request): BrowserKitResponse
58
45
59
46
private function convertRequest (BrowserKitRequest $ request ): Request
60
47
{
61
- $ environment = Environment::mock ($ request ->getServer ());
62
- $ uri = Uri::createFromString ($ request ->getUri ());
63
- $ headers = Headers::createFromEnvironment ($ environment );
64
- $ cookieHeader = $ headers ->get ('Cookie ' , []);
65
- $ cookies = Cookies::parseHeader ($ cookieHeader [0 ] ?? '' );
66
-
67
- $ slimRequest = Request::createFromEnvironment ($ environment );
68
- $ slimRequest = $ slimRequest
69
- ->withMethod ($ request ->getMethod ())
70
- ->withUri ($ uri )
71
- ->withUploadedFiles ($ this ->convertFiles ($ request ->getFiles ()))
72
- ->withCookieParams ($ cookies );
73
-
74
- foreach ($ headers ->keys () as $ key ) {
75
- $ slimRequest = $ slimRequest ->withHeader ($ key , $ headers ->get ($ key ));
76
- }
48
+ $ server = $ request ->getServer ();
49
+ $ method = $ request ->getMethod ();
50
+ $ content = (string )$ request ->getContent ();
77
51
78
- $ requestContent = $ request ->getContent ();
79
- if ($ requestContent !== null ) {
80
- $ body = new RequestBody ();
81
- $ body ->write ($ requestContent );
52
+ $ uri = (new UriFactory ())->createUri ($ request ->getUri ());
53
+ $ headers = $ this ->convertToHeaders ($ server );
54
+ $ cookies = Cookies::parseHeader ($ headers ->getHeader ('Cookie ' , []));
55
+ $ body = (new StreamFactory ())->createStream ($ content );
56
+ $ uploadedFiles = $ this ->convertFiles ($ request ->getFiles ());
82
57
83
- $ slimRequest = $ slimRequest ->withBody ($ body );
84
- }
58
+ $ slimRequest = new Request ($ method , $ uri , $ headers , $ cookies , $ server , $ body , $ uploadedFiles );
85
59
86
60
$ parsed = [];
87
- if ($ request -> getMethod () !== 'GET ' ) {
61
+ if ($ method !== 'GET ' ) {
88
62
$ parsed = $ request ->getParameters ();
89
63
}
90
64
@@ -96,6 +70,37 @@ private function convertRequest(BrowserKitRequest $request): Request
96
70
return $ slimRequest ;
97
71
}
98
72
73
+ /**
74
+ * Collect headers from server variables and transform to proper header names.
75
+ *
76
+ * @param array $serverVariables List of server variables.
77
+ *
78
+ * @return Headers
79
+ */
80
+ private function convertToHeaders (array $ serverVariables ): Headers
81
+ {
82
+ $ headers = [];
83
+ foreach ($ serverVariables as $ key => $ value ) {
84
+ // Replace underscores to dashes.
85
+ $ headerName = str_replace ('_ ' , '- ' , $ key );
86
+
87
+ // Transform the first characters to uppercase of each word, other characters are lowercased.
88
+ $ headerName = implode ('- ' , array_map ('ucfirst ' , explode ('- ' , strtolower ($ headerName ))));
89
+
90
+ // Decode if there are html entities in the header name.
91
+ $ headerName = html_entity_decode ($ headerName , ENT_NOQUOTES );
92
+
93
+ // Collect headers from server variables and cut "Http-" prefix.
94
+ if (strpos ($ headerName , 'Http- ' ) === 0 ) {
95
+ $ headerName = substr ($ headerName , 5 );
96
+
97
+ $ headers [$ headerName ] = $ value ;
98
+ }
99
+ }
100
+
101
+ return new Headers ($ headers , $ serverVariables );
102
+ }
103
+
99
104
/**
100
105
* Convert uploaded file list to UploadedFile instances.
101
106
*
0 commit comments