Skip to content

Commit 66cb38a

Browse files
[2.x] Fixes Swoole PUT|PATCH|DELETE requests on Laravel 11 (#862)
* Use InputBag instead of ParameterBag Use InputBag instead of ParameterBag * Adds tests * Runs only on Swoole --------- Co-authored-by: sy-records <[email protected]>
1 parent 6133c1c commit 66cb38a

File tree

2 files changed

+169
-2
lines changed

2 files changed

+169
-2
lines changed

src/Swoole/Actions/ConvertSwooleRequestToIlluminateRequest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Laravel\Octane\Swoole\Actions;
44

55
use Illuminate\Http\Request;
6-
use Symfony\Component\HttpFoundation\ParameterBag;
6+
use Symfony\Component\HttpFoundation\InputBag;
77
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
88

99
class ConvertSwooleRequestToIlluminateRequest
@@ -35,7 +35,7 @@ public function __invoke($swooleRequest, string $phpSapi): Request
3535
in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'PATCH', 'DELETE'])) {
3636
parse_str($request->getContent(), $data);
3737

38-
$request->request = new ParameterBag($data);
38+
$request->request = new InputBag($data);
3939
}
4040

4141
return Request::createFromBase($request);

tests/SwooleRequestTest.php

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
<?php
2+
3+
namespace Laravel\Octane\Tests;
4+
5+
use Illuminate\Http\Request;
6+
use Laravel\Octane\Swoole\Actions\ConvertSwooleRequestToIlluminateRequest;
7+
use Mockery;
8+
use Orchestra\Testbench\TestCase;
9+
use Swoole\Http\Request as SwooleRequest;
10+
11+
class SwooleRequestTest extends TestCase
12+
{
13+
public function setUp(): void
14+
{
15+
parent::setUp();
16+
17+
if (! extension_loaded('swoole')) {
18+
$this->markTestSkipped('Swoole extension is not installed.');
19+
}
20+
}
21+
22+
public function test_convert_swoole_request_to_illuminate_request()
23+
{
24+
$swooleRequest = new SwooleRequest();
25+
26+
$action = new ConvertSwooleRequestToIlluminateRequest();
27+
28+
$request = $action->__invoke($swooleRequest, 'cli-server');
29+
30+
$this->assertInstanceOf(Request::class, $request);
31+
}
32+
33+
public function test_server_variables()
34+
{
35+
$swooleRequest = new SwooleRequest();
36+
37+
$swooleRequest->server = [
38+
'REQUEST_METHOD' => 'GET',
39+
'REQUEST_URI' => '/foo',
40+
'QUERY_STRING' => 'bar=baz',
41+
'SERVER_PROTOCOL' => 'HTTP/1.1',
42+
];
43+
44+
$swooleRequest->header = [
45+
'host' => 'localhost',
46+
'content-type' => 'application/json',
47+
];
48+
49+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
50+
51+
$this->assertSame('GET', $request->server->get('REQUEST_METHOD'));
52+
$this->assertSame('GET', $request->getMethod());
53+
$this->assertSame('/foo?bar=baz', $request->server->get('REQUEST_URI'));
54+
$this->assertSame('/foo?bar=baz', $request->getRequestUri());
55+
$this->assertSame('HTTP/1.1', $request->server->get('SERVER_PROTOCOL'));
56+
$this->assertSame('HTTP/1.1', $request->getProtocolVersion());
57+
$this->assertSame('localhost', $request->header('host'));
58+
$this->assertSame('localhost', $request->getHost());
59+
$this->assertSame('application/json', $request->header('content-type'));
60+
}
61+
62+
public function test_get()
63+
{
64+
$swooleRequest = new SwooleRequest();
65+
$swooleRequest->get = [
66+
'foo' => 'bar',
67+
];
68+
69+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
70+
71+
$this->assertSame('bar', $request->get('foo'));
72+
$this->assertSame('bar', $request->input('foo'));
73+
$this->assertSame('bar', $request->query('foo'));
74+
}
75+
76+
public function test_post()
77+
{
78+
$swooleRequest = new SwooleRequest();
79+
$swooleRequest->header = [
80+
'content-type' => 'application/x-www-form-urlencoded',
81+
];
82+
$swooleRequest->server = [
83+
'REQUEST_METHOD' => 'POST',
84+
];
85+
86+
$swooleRequest->post = [
87+
'foo' => 'bar',
88+
];
89+
90+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
91+
92+
$this->assertSame('bar', $request->post('foo'));
93+
$this->assertSame('bar', $request->input('foo'));
94+
}
95+
96+
public function test_put()
97+
{
98+
$swooleRequest = Mockery::mock(new SwooleRequest())->makePartial();
99+
100+
$swooleRequest->header = [
101+
'content-type' => 'application/x-www-form-urlencoded',
102+
];
103+
$swooleRequest->server = [
104+
'REQUEST_METHOD' => 'PUT',
105+
];
106+
107+
$swooleRequest->shouldReceive('rawContent')->andReturn('foo=bar');
108+
109+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
110+
111+
$this->assertSame('bar', $request->input('foo'));
112+
$this->assertSame('bar', $request->get('foo'));
113+
$this->assertSame('bar', $request->post('foo'));
114+
}
115+
116+
public function test_patch()
117+
{
118+
$swooleRequest = Mockery::mock(new SwooleRequest())->makePartial();
119+
120+
$swooleRequest->header = [
121+
'content-type' => 'application/x-www-form-urlencoded',
122+
];
123+
$swooleRequest->server = [
124+
'REQUEST_METHOD' => 'PATCH',
125+
];
126+
127+
$swooleRequest->shouldReceive('rawContent')->andReturn('foo=bar');
128+
129+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
130+
131+
$this->assertSame('bar', $request->input('foo'));
132+
$this->assertSame('bar', $request->get('foo'));
133+
$this->assertSame('bar', $request->post('foo'));
134+
}
135+
136+
public function test_delete()
137+
{
138+
$swooleRequest = Mockery::mock(new SwooleRequest())->makePartial();
139+
140+
$swooleRequest->header = [
141+
'content-type' => 'application/x-www-form-urlencoded',
142+
];
143+
$swooleRequest->server = [
144+
'REQUEST_METHOD' => 'DELETE',
145+
];
146+
147+
$swooleRequest->shouldReceive('rawContent')->andReturn('foo=bar');
148+
149+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
150+
151+
$this->assertSame('bar', $request->input('foo'));
152+
$this->assertSame('bar', $request->get('foo'));
153+
$this->assertSame('bar', $request->post('foo'));
154+
}
155+
156+
public function test_cookie()
157+
{
158+
$swooleRequest = new SwooleRequest();
159+
$swooleRequest->cookie = [
160+
'foo' => 'bar',
161+
];
162+
163+
$request = (new ConvertSwooleRequestToIlluminateRequest())->__invoke($swooleRequest, 'cli-server');
164+
165+
$this->assertSame('bar', $request->cookie('foo'));
166+
}
167+
}

0 commit comments

Comments
 (0)