55namespace DoclerLabs \CodeceptionSlimModule \Lib \Connector ;
66
77use Psr \Http \Message \UploadedFileInterface ;
8- use RuntimeException ;
98use 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 ;
1915use Symfony \Component \BrowserKit \AbstractBrowser ;
2016use Symfony \Component \BrowserKit \Request as BrowserKitRequest ;
2117use Symfony \Component \BrowserKit \Response as BrowserKitResponse ;
2218
23- class Slim extends AbstractBrowser
19+ class SlimPsr7 extends AbstractBrowser
2420{
2521 /** @var App */
2622 private $ app ;
@@ -37,17 +33,8 @@ public function setApp(App $app): void
3733 */
3834 protected function doRequest ($ request ): BrowserKitResponse
3935 {
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 );
5138
5239 return new BrowserKitResponse (
5340 (string )$ slimResponse ->getBody (),
@@ -58,33 +45,20 @@ protected function doRequest($request): BrowserKitResponse
5845
5946 private function convertRequest (BrowserKitRequest $ request ): Request
6047 {
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 ();
7751
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 ());
8257
83- $ slimRequest = $ slimRequest ->withBody ($ body );
84- }
58+ $ slimRequest = new Request ($ method , $ uri , $ headers , $ cookies , $ server , $ body , $ uploadedFiles );
8559
8660 $ parsed = [];
87- if ($ request -> getMethod () !== 'GET ' ) {
61+ if ($ method !== 'GET ' ) {
8862 $ parsed = $ request ->getParameters ();
8963 }
9064
@@ -96,6 +70,37 @@ private function convertRequest(BrowserKitRequest $request): Request
9670 return $ slimRequest ;
9771 }
9872
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+
99104 /**
100105 * Convert uploaded file list to UploadedFile instances.
101106 *
0 commit comments