Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.

Commit cd50a39

Browse files
author
Zachary He
committed
Add Gzip support on chunk
1 parent 0bd0037 commit cd50a39

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

src/Server/Manager.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public function onRequest($swooleRequest, $swooleResponse)
225225
$illuminateResponse = $sandbox->run($illuminateRequest);
226226

227227
// send response
228-
Response::make($illuminateResponse, $swooleResponse)->send();
228+
Response::make($illuminateResponse, $swooleResponse, $swooleRequest)->send();
229229
} catch (Throwable $e) {
230230
try {
231231
$exceptionResponse = $this->app
@@ -234,7 +234,7 @@ public function onRequest($swooleRequest, $swooleResponse)
234234
$illuminateRequest,
235235
$this->normalizeException($e)
236236
);
237-
Response::make($exceptionResponse, $swooleResponse)->send();
237+
Response::make($exceptionResponse, $swooleResponse, $swooleRequest)->send();
238238
} catch (Throwable $e) {
239239
$this->logServerError($e);
240240
}

src/Transformers/Response.php

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Http\Response as IlluminateResponse;
66
use Swoole\Http\Response as SwooleResponse;
7+
use Swoole\Http\Request as SwooleRequest;
78
use Symfony\Component\HttpFoundation\BinaryFileResponse;
89
use Symfony\Component\HttpFoundation\Response as SymfonyResponse;
910
use Symfony\Component\HttpFoundation\StreamedResponse;
@@ -17,6 +18,11 @@ class Response
1718
*/
1819
protected $swooleResponse;
1920

21+
/**
22+
* @var \Swoole\Http\Request
23+
*/
24+
protected $swooleRequest;
25+
2026
/**
2127
* @var \Illuminate\Http\Response
2228
*/
@@ -27,24 +33,27 @@ class Response
2733
*
2834
* @param $illuminateResponse
2935
* @param \Swoole\Http\Response $swooleResponse
36+
* @param \Swoole\Http\Request $swooleRequest
3037
*
3138
* @return \SwooleTW\Http\Transformers\Response
3239
*/
33-
public static function make($illuminateResponse, SwooleResponse $swooleResponse)
40+
public static function make($illuminateResponse, SwooleResponse $swooleResponse, SwooleRequest $swooleRequest)
3441
{
35-
return new static($illuminateResponse, $swooleResponse);
42+
return new static($illuminateResponse, $swooleResponse, $swooleRequest);
3643
}
3744

3845
/**
3946
* Response constructor.
4047
*
4148
* @param mixed $illuminateResponse
4249
* @param \Swoole\Http\Response $swooleResponse
50+
* @param \Swoole\Http\Request $swooleRequest
4351
*/
44-
public function __construct($illuminateResponse, SwooleResponse $swooleResponse)
52+
public function __construct($illuminateResponse, SwooleResponse $swooleResponse, SwooleRequest $swooleRequest)
4553
{
4654
$this->setIlluminateResponse($illuminateResponse);
4755
$this->setSwooleResponse($swooleResponse);
56+
$this->setSwooleRequest($swooleRequest);
4857
}
4958

5059
/**
@@ -133,6 +142,12 @@ protected function sendInChunk($content)
133142
return;
134143
}
135144

145+
// Swoole Chunk mode does not support compress by default, this patch only supports gzip
146+
if ($chunkGzip) {
147+
$this->swooleResponse->header('Content-Encoding', 'gzip');
148+
$content = gzencode($content, config('swoole_http.server.options.http_compression_level', 3));
149+
}
150+
136151
foreach (str_split($content, static::CHUNK_SIZE) as $chunk) {
137152
$this->swooleResponse->write($chunk);
138153
}
@@ -184,4 +199,37 @@ public function getIlluminateResponse()
184199
{
185200
return $this->illuminateResponse;
186201
}
202+
203+
/**
204+
* @param \Swoole\Http\Request $swooleRequest
205+
*
206+
* @return \SwooleTW\Http\Transformers\Response
207+
*/
208+
protected function setSwooleRequest(SwooleRequest $swooleRequest)
209+
{
210+
$this->swooleRequest = $swooleRequest;
211+
212+
return $this;
213+
}
214+
215+
/**
216+
* @return \Swoole\Http\Request
217+
*/
218+
public function getSwooleRequest()
219+
{
220+
return $this->swooleRequest;
221+
}
222+
223+
/**
224+
* @param string $responseContentEncoding
225+
* @return bool
226+
*/
227+
protected function canGzipContent($responseContentEncoding)
228+
{
229+
return empty($responseContentEncoding) &&
230+
config('swoole_http.server.options.http_compression', true) &&
231+
!empty($this->swooleRequest->header['accept-encoding']) &&
232+
strpos($this->swooleRequest->header['accept-encoding'], 'gzip') !== false &&
233+
function_exists('gzencode');
234+
}
187235
}

tests/Transformers/ResponseTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,30 @@
44

55
use Illuminate\Http\Response as IlluminateResponse;
66
use Swoole\Http\Response as SwooleResponse;
7+
use Swoole\Http\Request as SwooleRequest;
78
use SwooleTW\Http\Tests\TestCase;
89
use SwooleTW\Http\Transformers\Response;
910

1011
class ResponseTest extends TestCase
1112
{
1213
public function testMake()
1314
{
14-
$response = Response::make(new IlluminateResponse, new SwooleResponse);
15+
$response = Response::make(new IlluminateResponse, new SwooleResponse, new SwooleRequest);
1516

1617
$this->assertInstanceOf(Response::class, $response);
1718
}
1819

1920
public function testGetIlluminateResponse()
2021
{
21-
$response = Response::make(new IlluminateResponse, new SwooleResponse);
22+
$response = Response::make(new IlluminateResponse, new SwooleResponse, new SwooleRequest);
2223
$illuminateResponse = $response->getIlluminateResponse();
2324

2425
$this->assertInstanceOf(IlluminateResponse::class, $illuminateResponse);
2526
}
2627

2728
public function testGetSwooleResponse()
2829
{
29-
$response = Response::make(new IlluminateResponse, new SwooleResponse);
30+
$response = Response::make(new IlluminateResponse, new SwooleResponse, new SwooleRequest);
3031
$swooleResponse = $response->getSwooleResponse();
3132

3233
$this->assertInstanceOf(SwooleResponse::class, $swooleResponse);

0 commit comments

Comments
 (0)