问题
Is it possible to alter the headers of a Response object, as returned by fetch()?
Suppose I want to transform a response via resFn
:
self.addEventListener('fetch', function (event) {
event.respondWith(fetch(event.request).then(resFn));
});
What should resFn()
look like? One attempt:
function resFn(res) {
res = res.clone();
res.headers.set("foo", "bar");
return res;
}
Fails with TypeError: Failed to execute 'set' on 'Headers': Headers are immutable
.
(A separate question and answer explain how to alter the headers of a request. Given that the the Request and Response objects are surprisingly dissimilar (different properties, and their constructors take different arguments), does the same solution apply?)
回答1:
This can be done by "manually" cloning the response:
function resFn(res) {
return newResponse(res, function (headers) {
headers.set("foo", "bar");
return headers;
});
}
where the newResponse()
helper function is:
function newResponse(res, headerFn) {
function cloneHeaders() {
var headers = new Headers();
for (var kv of res.headers.entries()) {
headers.append(kv[0], kv[1]);
}
return headers;
}
var headers = headerFn ? headerFn(cloneHeaders()) : res.headers;
return new Promise(function (resolve) {
return res.blob().then(function (blob) {
resolve(new Response(blob, {
status: res.status,
statusText: res.statusText,
headers: headers
}));
});
});
}
Note that newResponse()
returns a Promise<Response>
.
来源:https://stackoverflow.com/questions/35421179/how-to-alter-the-headers-of-a-response