Skip to content

Commit e8c1af1

Browse files
author
Guy Bedford
committed
fix!: immutable headers guards for incoming response and downstream request
1 parent c5986c2 commit e8c1af1

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

integration-tests/js-compute/fixtures/app/src/request-headers.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-env serviceworker */
2+
import { assertThrows } from './assertions.js';
23
import { routes } from './routes.js';
34

45
{
@@ -7,6 +8,11 @@ import { routes } from './routes.js';
78
* @type {Request} request
89
**/
910
const request = event.request;
11+
12+
assertThrows(() => {
13+
request.headers.set('should-be', 'immutable');
14+
}, TypeError);
15+
1016
const headers = {};
1117
for (const [name, value] of request.headers.entries()) {
1218
if (!headers[name]) {

integration-tests/js-compute/fixtures/app/src/response.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-env serviceworker */
22

33
import { routes } from './routes.js';
4-
import { assert } from './assertions.js';
4+
import { assert, assertThrows } from './assertions.js';
55
import { allowDynamicBackends } from 'fastly:experimental';
66

77
routes.set('/response/stall', async (event) => {
@@ -64,6 +64,11 @@ routes.set('/response/request-body-init', async () => {
6464
accept: 'image/webp',
6565
},
6666
});
67+
68+
assertThrows(() => {
69+
downloadResp.headers.set('should-be', 'immutable');
70+
}, TypeError);
71+
6772
// stream it through an echo proxy
6873
const postResp = await fetch(
6974
new Request('https://httpbin.org/anything', {

runtime/fastly/builtins/fetch/request-response.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ JSObject *Request::headers(JSContext *cx, JS::HandleObject obj) {
459459
if (!headers) {
460460
MOZ_ASSERT(is_instance(obj));
461461
if (is_downstream(obj)) {
462-
headers = Headers::create(cx, request_handle(obj).headers(), Headers::HeadersGuard::Request);
462+
headers = Headers::create(cx, request_handle(obj).headers(), Headers::HeadersGuard::Immutable);
463463
} else {
464464
headers = Headers::create(cx, Headers::HeadersGuard::Request);
465465
}
@@ -481,7 +481,7 @@ JSObject *Response::headers(JSContext *cx, JS::HandleObject obj) {
481481
headers =
482482
Headers::create(cx, response_handle(obj).headers(), Headers::HeadersGuard::Response);
483483
} else {
484-
headers = Headers::create(cx, Headers::HeadersGuard::Response);
484+
headers = Headers::create(cx, Headers::HeadersGuard::Immutable);
485485
}
486486
if (!headers) {
487487
return nullptr;

0 commit comments

Comments
 (0)