4
4
5
5
use Illuminate \Http \Response as IlluminateResponse ;
6
6
use Swoole \Http \Response as SwooleResponse ;
7
+ use Swoole \Http \Request as SwooleRequest ;
7
8
use Symfony \Component \HttpFoundation \BinaryFileResponse ;
8
9
use Symfony \Component \HttpFoundation \Response as SymfonyResponse ;
9
10
use Symfony \Component \HttpFoundation \StreamedResponse ;
@@ -17,6 +18,11 @@ class Response
17
18
*/
18
19
protected $ swooleResponse ;
19
20
21
+ /**
22
+ * @var \Swoole\Http\Request
23
+ */
24
+ protected $ swooleRequest ;
25
+
20
26
/**
21
27
* @var \Illuminate\Http\Response
22
28
*/
@@ -27,24 +33,27 @@ class Response
27
33
*
28
34
* @param $illuminateResponse
29
35
* @param \Swoole\Http\Response $swooleResponse
36
+ * @param \Swoole\Http\Request $swooleRequest
30
37
*
31
38
* @return \SwooleTW\Http\Transformers\Response
32
39
*/
33
- public static function make ($ illuminateResponse , SwooleResponse $ swooleResponse )
40
+ public static function make ($ illuminateResponse , SwooleResponse $ swooleResponse, SwooleRequest $ swooleRequest )
34
41
{
35
- return new static ($ illuminateResponse , $ swooleResponse );
42
+ return new static ($ illuminateResponse , $ swooleResponse, $ swooleRequest );
36
43
}
37
44
38
45
/**
39
46
* Response constructor.
40
47
*
41
48
* @param mixed $illuminateResponse
42
49
* @param \Swoole\Http\Response $swooleResponse
50
+ * @param \Swoole\Http\Request $swooleRequest
43
51
*/
44
- public function __construct ($ illuminateResponse , SwooleResponse $ swooleResponse )
52
+ public function __construct ($ illuminateResponse , SwooleResponse $ swooleResponse, SwooleRequest $ swooleRequest )
45
53
{
46
54
$ this ->setIlluminateResponse ($ illuminateResponse );
47
55
$ this ->setSwooleResponse ($ swooleResponse );
56
+ $ this ->setSwooleRequest ($ swooleRequest );
48
57
}
49
58
50
59
/**
@@ -117,22 +126,30 @@ protected function sendContent()
117
126
} elseif ($ illuminateResponse instanceof BinaryFileResponse) {
118
127
$ this ->swooleResponse ->sendfile ($ illuminateResponse ->getFile ()->getPathname ());
119
128
} else {
120
- $ this ->sendInChunk ($ illuminateResponse ->getContent ());
129
+ $ chunkGzip = $ this ->canGzipContent ($ illuminateResponse ->headers ->get ('Content-Encoding ' ));
130
+ $ this ->sendInChunk ($ illuminateResponse ->getContent (), $ chunkGzip );
121
131
}
122
132
}
123
133
124
134
/**
125
135
* Send content in chunk
126
136
*
127
137
* @param string $content
138
+ * @param bool $chunkGzip
128
139
*/
129
- protected function sendInChunk ($ content )
140
+ protected function sendInChunk ($ content, $ chunkGzip )
130
141
{
131
142
if (strlen ($ content ) <= static ::CHUNK_SIZE ) {
132
143
$ this ->swooleResponse ->end ($ content );
133
144
return ;
134
145
}
135
146
147
+ // Swoole Chunk mode does not support compress by default, this patch only supports gzip
148
+ if ($ chunkGzip ) {
149
+ $ this ->swooleResponse ->header ('Content-Encoding ' , 'gzip ' );
150
+ $ content = gzencode ($ content , config ('swoole_http.server.options.http_compression_level ' , 3 ));
151
+ }
152
+
136
153
foreach (str_split ($ content , static ::CHUNK_SIZE ) as $ chunk ) {
137
154
$ this ->swooleResponse ->write ($ chunk );
138
155
}
@@ -184,4 +201,37 @@ public function getIlluminateResponse()
184
201
{
185
202
return $ this ->illuminateResponse ;
186
203
}
204
+
205
+ /**
206
+ * @param \Swoole\Http\Request $swooleRequest
207
+ *
208
+ * @return \SwooleTW\Http\Transformers\Response
209
+ */
210
+ protected function setSwooleRequest (SwooleRequest $ swooleRequest )
211
+ {
212
+ $ this ->swooleRequest = $ swooleRequest ;
213
+
214
+ return $ this ;
215
+ }
216
+
217
+ /**
218
+ * @return \Swoole\Http\Request
219
+ */
220
+ public function getSwooleRequest ()
221
+ {
222
+ return $ this ->swooleRequest ;
223
+ }
224
+
225
+ /**
226
+ * @param string $responseContentEncoding
227
+ * @return bool
228
+ */
229
+ protected function canGzipContent ($ responseContentEncoding )
230
+ {
231
+ return empty ($ responseContentEncoding ) &&
232
+ config ('swoole_http.server.options.http_compression ' , true ) &&
233
+ !empty ($ this ->swooleRequest ->header ['accept-encoding ' ]) &&
234
+ strpos ($ this ->swooleRequest ->header ['accept-encoding ' ], 'gzip ' ) !== false &&
235
+ function_exists ('gzencode ' );
236
+ }
187
237
}
0 commit comments