// This worker is meant to test range requests where the responses are a mix of // opaque ones and non-opaque ones. It forwards the first request to a // cross-origin URL (generating an opaque response). The server is expected to // return a 206 Partial Content response. Then the worker forwards subsequent // range requests to that URL, with CORS sharing generating a non-opaque // responses. The intent is to try to trick the browser into treating the // resource as non-opaque. // // It would also be interesting to do the reverse test where the first request // uses 'cors', and subsequent range requests use 'no-cors' mode. But the // service worker cannot do this, because in 'no-cors' mode the 'range' HTTP // header is disallowed. importScripts('/common/get-host-info.sub.js') let initial = true; function is_initial_request() { const old = initial; initial = false; return old; } self.addEventListener('fetch', e => { const url = new URL(e.request.url); if (url.search.indexOf('VIDEO') == -1) { // Fall back for non-video. return; } let cross_origin_url = get_host_info().HTTPS_REMOTE_ORIGIN + url.pathname + url.search; // The first request is no-cors. if (is_initial_request()) { const init = { mode: 'no-cors', headers: e.request.headers }; const cross_origin_request = new Request(cross_origin_url, init); e.respondWith(fetch(cross_origin_request)); return; } // Subsequent range requests are cors. // Copy headers needed for range requests. let my_headers = new Headers; if (e.request.headers.get('accept')) my_headers.append('accept', e.request.headers.get('accept')); if (e.request.headers.get('range')) my_headers.append('range', e.request.headers.get('range')); // Add &ACAOrigin to allow CORS. cross_origin_url += '&ACAOrigin=' + get_host_info().HTTPS_ORIGIN; // Add &ACAHeaders to allow range requests. cross_origin_url += '&ACAHeaders=accept,range'; // Make the CORS request. const init = { mode: 'cors', headers: my_headers }; const cross_origin_request = new Request(cross_origin_url, init); e.respondWith(fetch(cross_origin_request)); });