2016-02-15 4 views
0

Возможно ли изменить заголовки объекта Response, как указано fetch()?Как изменить заголовки ответа?

Предположим, я хочу, чтобы преобразовать ответ через resFn:

self.addEventListener('fetch', function (event) { 
    event.respondWith(fetch(event.request).then(resFn)); 
}); 

Что должно resFn() выглядеть? Одна попытка:

function resFn(res) { 
    res = res.clone(); 
    res.headers.set("foo", "bar"); 
    return res; 
} 

Сбой с TypeError: Failed to execute 'set' on 'Headers': Headers are immutable.

(отдельный вопрос и ответ объяснить how to alter the headers of a request. Учитывая, что в Request и Response объекты удивительно непохожи (разные свойства, и их конструкторы принимают разные аргументы), делает то же самое решение применить?)

+0

Возможный дубликат [Как изменить заголовки запроса?] (Http://stackoverflow.com/questions/35420980/how-to-alter-the-headers-of-a-request) –

ответ

0

Это может быть сделано "вручную" клонирование ответа:

function resFn(res) { 
    return newResponse(res, function (headers) { 
    headers.set("foo", "bar"); 
    return headers; 
    }); 
} 

где функция newResponse() помощника:

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 
     })); 
    }); 
    }); 

} 

Обратите внимание, что newResponse() возвращает Promise<Response>.