def main(request, response): # Set mode to 'init' for initial fetch. mode = b'init' if b'update-recovery-mode' in request.cookies: mode = request.cookies[b'update-recovery-mode'].value # no-cache itself to ensure the user agent finds a new version for each update. headers = [(b'Cache-Control', b'no-cache, must-revalidate'), (b'Pragma', b'no-cache')] extra_body = b'' if mode == b'init': # Install a bad service worker that will break the controlled # document navigation. response.set_cookie(b'update-recovery-mode', b'bad') extra_body = b"addEventListener('fetch', function(e) { e.respondWith(Promise.reject()); });" elif mode == b'bad': # When the update tries to pull the script again, update to # a worker service worker that does not break document # navigation. Serve the same script from then on. response.delete_cookie(b'update-recovery-mode') headers.append((b'Content-Type', b'application/javascript')) return headers, b'%s' % (extra_body)