Skip to content

Commit ae2464b

Browse files
committed
feat: gzip encode html responses
see: https://twitter.com/deleugyn/status/1559197587353337856
1 parent 6878934 commit ae2464b

File tree

8 files changed

+104
-25
lines changed

8 files changed

+104
-25
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"ext-json": "*",
1919
"ext-pcntl": "*",
2020
"ext-posix": "*",
21+
"ext-zlib": "*",
2122
"async-aws/lambda": "^1.0",
2223
"async-aws/ssm": "^1.0",
2324
"hollodotme/fast-cgi-client": "^3.0",

composer.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Lambda/Response/HttpResponse.php

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
namespace Ymir\Runtime\Lambda\Response;
1515

16+
use Tightenco\Collect\Support\Collection;
17+
1618
/**
1719
* An HTTP lambda response.
1820
*/
@@ -78,18 +80,16 @@ public function getResponseData(): array
7880
return $data;
7981
}
8082

81-
$data['body'] = base64_encode($this->body);
82-
83-
$headers = collect($this->headers)->mapWithKeys(function ($values, $name) {
84-
$name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
85-
$values = array_values((array) $values);
86-
87-
return [$name => $values];
88-
});
83+
$body = $this->body;
84+
$headers = $this->getFormattedHeaders();
8985
$headersKey = '1.0' === $this->formatVersion ? 'multiValueHeaders' : 'headers';
9086

91-
if (!isset($headers['Content-Type'])) {
92-
$headers['Content-Type'] = ['text/html'];
87+
// Compress HTML responses if they haven't already. This helps prevent hitting the Lambda
88+
// payload limit since compression happens after the response gets sent back.
89+
if (!isset($headers['Content-Encoding']) && ['text/html'] === $headers['Content-Type']) {
90+
$body = (string) gzencode($body, 9);
91+
$headers['Content-Encoding'] = ['gzip'];
92+
$headers['Content-Length'] = [strlen($body)];
9393
}
9494

9595
if ('2.0' === $this->formatVersion && isset($headers['Set-Cookie'])) {
@@ -103,10 +103,31 @@ public function getResponseData(): array
103103
});
104104
}
105105

106+
$data['body'] = base64_encode($body);
107+
106108
// PHP will serialize an empty array to `[]`. However, we need it to be an empty JSON object
107109
// which is `{}` so we convert an empty array to an empty object.
108110
$data[$headersKey] = $headers->isEmpty() ? new \stdClass() : $headers->all();
109111

110112
return $data;
111113
}
114+
115+
/**
116+
* Get the HTTP response headers properly formatted for a Lambda response.
117+
*/
118+
private function getFormattedHeaders(): Collection
119+
{
120+
$headers = collect($this->headers)->mapWithKeys(function ($values, $name) {
121+
$name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
122+
$values = array_values((array) $values);
123+
124+
return [$name => $values];
125+
});
126+
127+
if (!isset($headers['Content-Type'])) {
128+
$headers['Content-Type'] = ['text/html'];
129+
}
130+
131+
return $headers;
132+
}
112133
}

tests/Unit/FastCgi/FastCgiHttpResponseTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ public function testGetResponseDataWithDefaults()
4141
$this->assertSame([
4242
'isBase64Encoded' => true,
4343
'statusCode' => 200,
44-
'body' => '',
44+
'body' => 'H4sIAAAAAAACEwMAAAAAAAAAAAA=',
4545
'multiValueHeaders' => [
4646
'Content-Type' => ['text/html'],
47+
'Content-Encoding' => ['gzip'],
48+
'Content-Length' => [20],
4749
],
4850
], $fastCgiResponse->getResponseData());
4951
}
@@ -65,9 +67,11 @@ public function testGetResponseDataWithStatusHeader()
6567
$this->assertSame([
6668
'isBase64Encoded' => true,
6769
'statusCode' => 201,
68-
'body' => '',
70+
'body' => 'H4sIAAAAAAACEwMAAAAAAAAAAAA=',
6971
'multiValueHeaders' => [
7072
'Content-Type' => ['text/html'],
73+
'Content-Encoding' => ['gzip'],
74+
'Content-Length' => [20],
7175
],
7276
], $fastCgiResponse->getResponseData());
7377
}

tests/Unit/Lambda/Handler/WarmUpEventHandlerTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ public function testHandleDoesntInvokeAdditionalFunctionsWhenConcurrencyIsOne()
5959
$this->assertSame([
6060
'isBase64Encoded' => true,
6161
'statusCode' => 200,
62-
'body' => 'Tm8gYWRkaXRpb25hbCBmdW5jdGlvbiB3YXJtZWQgdXA=',
62+
'body' => 'H4sIAAAAAAACE/PLV0hMScksyczPS8xRSCvNSwYxFcoTi3JTUxRKCwBYiDpTIAAAAA==',
6363
'multiValueHeaders' => [
6464
'Content-Type' => ['text/html'],
65+
'Content-Encoding' => ['gzip'],
66+
'Content-Length' => [49],
6567
],
6668
], $reponse->getResponseData());
6769
}
@@ -96,9 +98,11 @@ public function testHandleInvokesAdditionalFunctions()
9698
$this->assertSame([
9799
'isBase64Encoded' => true,
98100
'statusCode' => 200,
99-
'body' => 'V2FybWVkIHVwIGFkZGl0aW9uYWwgZnVuY3Rpb25z',
101+
'body' => 'H4sIAAAAAAACEwtPLMpNTVEoLVBITEnJLMnMz0vMUUgrzUsGMYsBzXzvwx4AAAA=',
100102
'multiValueHeaders' => [
101103
'Content-Type' => ['text/html'],
104+
'Content-Encoding' => ['gzip'],
105+
'Content-Length' => [47],
102106
],
103107
], $reponse->getResponseData());
104108
}

tests/Unit/Lambda/Response/ForbiddenHttpResponseTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ public function testGetDataWhenTemplateFound()
2626
$this->assertSame([
2727
'isBase64Encoded' => true,
2828
'statusCode' => 403,
29-
'body' => 'PCEtLQoKX18gIF9fICAgICAgICAgIF8KXCBcLyAvX19fIF9fXyAgKF8pX19fXwogXCAgLyBfXyBgX18gXC8gLyBfX18vCiAvIC8gLyAvIC8gLyAvIC8gLwovXy9fLyAvXy8gL18vXy9fLwoKLS0+Cgo8IURPQ1RZUEUgaHRtbD4KPGh0bWwgbGFuZz0iZW4iPgogICAgPGhlYWQ+CiAgICAgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CgogICAgICAgIDx0aXRsZT40MDMgfCBmb288L3RpdGxlPgoKICAgICAgICA8IS0tIEZvbnRzIC0tPgogICAgICAgIDxsaW5rIHJlbD0iZG5zLXByZWZldGNoIiBocmVmPSJodHRwczovL3JzbXMubWUvIj4KICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vcnNtcy5tZS9pbnRlci9pbnRlci5jc3MiIC8+CgogICAgICAgIDwhLS0gU3R5bGVzIC0tPgogICAgICAgIDxzdHlsZT4KICAgICAgICAgICAgaHRtbCwgYm9keSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTkxOTFlOwogICAgICAgICAgICAgICAgY29sb3I6ICM4MmMzMzk7CiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJ0ludGVyIHZhcicsIHVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbTsKICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAuZnVsbC1oZWlnaHQgewogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLmZsZXgtY2VudGVyIHsKICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC5mbGV4LWNlbnRlci1jb2x1bW4gewogICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC5wb3NpdGlvbi1yZWYgewogICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAuY29kZSB7CiAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZDsKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjZweDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgMTVweCAwIDE1cHg7CiAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC5tZXNzYWdlIHsKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgfQogICAgICAgIDwvc3R5bGU+CiAgICA8L2hlYWQ+CiAgICA8Ym9keT4KICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNlbnRlci1jb2x1bW4gcG9zaXRpb24tcmVmIGZ1bGwtaGVpZ2h0Ij4KICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZy1ib3R0b206IDIwcHg7Ij4KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly95bWlyYXBwLmNvbSI+CiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaC02IHctYXV0byIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgaWQ9InN2ZzIzNzA1NiIgdmlld0JveD0iMCAwIDIwMCA1MC4yMDE1NjEiIGhlaWdodD0iNTAuMjAxNTYxIiB3aWR0aD0iMjAwIiB2ZXJzaW9uPSIxLjEiIGlua3NjYXBlOnZlcnNpb249IjEuMC4xIChjNDk3YjAzYywgMjAyMC0wOS0xMCkiPgogICAgICAgICAgICAgICAgICAgICAgICA8c29kaXBvZGk6bmFtZWR2aWV3IHBhZ2Vjb2xvcj0iI2ZmZmZmZiIgYm9yZGVyY29sb3I9IiM2NjY2NjYiIGJvcmRlcm9wYWNpdHk9IjEiIG9iamVjdHRvbGVyYW5jZT0iMTAiIGdyaWR0b2xlcmFuY2U9IjEwIiBndWlkZXRvbGVyYW5jZT0iMTAiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE0NDAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg1NSIgaWQ9Im5hbWVkdmlldzExOCIgc2hvd2dyaWQ9ImZhbHNlIiBpbmtzY2FwZTp6b29tPSIwLjg0MjQ0NzkyIiBpbmtzY2FwZTpjeD0iMjcwLjM1MDE2IiBpbmtzY2FwZTpjeT0iNjcuODU5OTk3IiBpbmtzY2FwZTp3aW5kb3cteD0iMCIgaW5rc2NhcGU6d2luZG93LXk9IjIzIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcyMzcwNTYiPjwvc29kaXBvZGk6bmFtZWR2aWV3PgogICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhMjM3MDYyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZGY6cmRmPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYzp3b3JrIHJkZjphYm91dD0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiPjwvZGM6dHlwZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NjOndvcms+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JkZjpyZGY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmRmOnJkZj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2M6d29yayByZGY6YWJvdXQ9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIj48L2RjOnR5cGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2M6d29yaz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmRmOnJkZj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnMgaWQ9ImRlZnMyMzcwNjAiPjwvZGVmcz4KICAgICAgICAgICAgICAgICAgICAgICAgPGcgaWQ9ImxvZ28tZ3JvdXAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODkwNjYsMCwwLDAuMzY5ODkwNjYsLTg5LjM4NDAxOSwtMTE2LjkzNzIzKSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0idGl0bGUiIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjcycHg7bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTonTWVlZG9yaSBTYW5zJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1hbmNob3I6bWlkZGxlIiBhcmlhLWxhYmVsPSJZTUlSIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0icGF0aDIzNzA2NCIgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6NzJweDtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OidNZWVkb3JpIFNhbnMnO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWFuY2hvcjptaWRkbGU7ZmlsbDojYjdkOWEzIiBkPSJNIDQ0Mi4zMDk2Miw5NS4wMTYgViAxMjAgaCAtOSBWIDk1LjAxNiBMIDQxMS4yNzc2Miw2NiBoIDExLjAxNjAxIEwgNDM4LjM0OTYyLDg2LjAxNiA0NTMuMzI1NjIsNjYgaCAxMi4wMjQgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMi41LDAsMCwyLjUsLTc4Ni41NDQyMSwxNTEuNjgpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9InBhdGgyMzcwNjYiIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjcycHg7bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTonTWVlZG9yaSBTYW5zJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1hbmNob3I6bWlkZGxlO2ZpbGw6IzlhY2Q2YSIgZD0ibSA1MjguNjM1MzcsNjUuNzg0IHYgNTQuMjg4IGwgLTksLTcuMDU2IFYgODQuODY0IGwgLTE4LjE0NCwxNC4xMTIgLTE4LjA3MiwtMTQuMTEyIHYgMjguMTUyIGwgLTkuMDcyLDcuMDU2IFYgNjUuNzg0IGwgMjcuMTQ0LDIxLjE2OCB6IiB0cmFuc2Zvcm09Im1hdHJpeCgyLjUsMCwwLDIuNSwtNzcxLjU0NDIxLDE1MS42OCkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0icGF0aDIzNzA2OCIgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6NzJweDtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OidNZWVkb3JpIFNhbnMnO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWFuY2hvcjptaWRkbGU7ZmlsbDojODJjMzM5IiBkPSJtIDU0My42NzU1LDY2IGggOC45MjggdiA0Ny4wMTYgbCAtOC45MjgsNi45ODQgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMi41LDAsMCwyLjUsLTc1Ni41NDQyMSwxNTEuNjgpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9InBhdGgyMzcwNzAiIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjcycHg7bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTonTWVlZG9yaSBTYW5zJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1hbmNob3I6bWlkZGxlO2ZpbGw6IzY1YjcwMCIgZD0ibSA2MDkuNTU3NzUsMTIwIGggLTEwLjAwOCBsIC0xMS45NTIsLTIyLjAzMiBoIC0yMC4wMTYgViA4OS4wNCBoIDI1Ljk5MiBxIDEuNjU2LC0wLjA3MiAyLjk1MiwtMC44NjQgMS4xNTIsLTAuNjQ4IDIuMDg4LC0yLjA4OCAwLjkzNiwtMS40NCAwLjkzNiwtNC4xMDQgMCwtMi41OTIgLTAuOTM2LC00LjAzMiAtMC45MzYsLTEuNDQgLTIuMDg4LC0yLjA4OCAtMS4yOTYsLTAuNzkyIC0yLjk1MiwtMC44NjQgaCAtMjUuOTkyIHYgLTkgaCAyNS45OTIgcSA0LjE3NiwwLjIxNiA3LjQ4OCwyLjAxNiAxLjM2OCwwLjc5MiAyLjczNiwxLjk0NCAxLjM2OCwxLjE1MiAyLjM3NiwyLjgwOCAxLjA4LDEuNjU2IDEuNzI4LDMuOTYgMC42NDgsMi4yMzIgMC42NDgsNS4yNTYgMCw0Ljg5NiAtMS41ODQsOC4wNjQgLTEuNTg0LDMuMDk2IC0zLjYsNC44OTYgLTEuOTQ0LDEuNzI4IC0zLjc0NCwyLjM3NiAtMS43MjgsMC42NDggLTIuMDg4LDAuNjQ4IHoiIHRyYW5zZm9ybT0ibWF0cml4KDIuNSwwLDAsMi41LC03NDEuNTQ0MjEsMTUxLjY4KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgaWQ9InRhZ2xpbmUiIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo1MDA7Zm9udC1zaXplOjMycHg7bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTpNb250c2VycmF0O2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWFuY2hvcjptaWRkbGUiPjwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY2VudGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUiPgogICAgICAgICAgICAgICAgICAgIDQwMyAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIiBzdHlsZT0icGFkZGluZzogMTBweDsiPgogICAgICAgICAgICAgICAgICAgIGZvbyAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2JvZHk+CjwvaHRtbD4KCg==',
29+
'body' => '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',
3030
'headers' => [
3131
'Content-Type' => 'text/html',
32+
'Content-Encoding' => 'gzip',
33+
'Content-Length' => 1993,
3234
],
3335
], (new ForbiddenHttpResponse('foo', __DIR__.'/../../../../templates'))->getResponseData());
3436
}
@@ -38,9 +40,11 @@ public function testGetResponseDataWhenTemplateNotFound()
3840
$this->assertSame([
3941
'isBase64Encoded' => true,
4042
'statusCode' => 403,
41-
'body' => '',
43+
'body' => 'H4sIAAAAAAACEwMAAAAAAAAAAAA=',
4244
'headers' => [
4345
'Content-Type' => 'text/html',
46+
'Content-Encoding' => 'gzip',
47+
'Content-Length' => 20,
4448
],
4549
], (new ForbiddenHttpResponse('foo'))->getResponseData());
4650
}

0 commit comments

Comments
 (0)