chromium/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-interception-on-response-redirect.js

(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
  var {page, session, dp} = await testRunner.startBlank(
      `Tests interception blocking, modification of network fetches.`);

  var InterceptionHelper = await testRunner.loadScript('../resources/interception-test.js');
  var helper = new InterceptionHelper(testRunner, session);

  var headersMaskList = new Set(['date', 'server', 'last-modified', 'etag', 'keep-alive', 'x-powered-by', 'expires']);
  var headersHideList = new Set(['x-powered-by']);

  var requestInterceptedDict = {
    'ping-redirect.php': async event => {
      testRunner.log('Request Intercepted: ' + event.params.request.url.split('/').pop());
      testRunner.log('  responseErrorReason: ' + event.params.responseErrorReason);
      testRunner.log('  responseStatusCode: ' + event.params.responseStatusCode);
      var responseHeaders = event.params.responseHeaders;
      if (responseHeaders) {
        testRunner.log('  responseHeaders:');
        for (var headerName of Object.keys(event.params.responseHeaders).sort()) {
          var headerValue = event.params.responseHeaders[headerName].split(';')[0]; // Sometimes "; charset=UTF-8" gets in here.
          if (headersHideList.has(headerName.toLowerCase()))
            continue;
          if (headersMaskList.has(headerName.toLowerCase()))
            headerValue = '<Masked>';
          testRunner.log(`    ${headerName}: ${headerValue}`);
        }
      } else {
        testRunner.log('  responseHeaders: <None>');
      }

      if (event.params.redirectUrl)
        testRunner.log('  redirectUrl: ' + event.params.redirectUrl.split('/').pop());

      var bodyData = await session.protocol.Network.getResponseBodyForInterception({interceptionId: event.params.interceptionId});
      if (bodyData.error) {
        testRunner.log('  responseBody:');
        testRunner.log('    error: ' + bodyData.error.message);
      } else {
        testRunner.log('  responseBody:');
        testRunner.log(bodyData.result.base64Encoded ? atob(bodyData.result.body) : bodyData.result.body);
      }
      if (event.params.redirectUrl) {
        var body = '<html>\n<body>This content was rewritten!</body>\n</html>';
        var dummyHeaders = [
          'HTTP/1.1 200 OK',
          'Date: ' + (new Date()).toUTCString(),
          'Connection: closed',
          'Content-Length: ' + body.size,
          'Content-Type: text/html'
        ];
        testRunner.log('Modifying request with new body.');
        helper.modifyRequest(event, {rawResponse: btoa(dummyHeaders.join('\r\n') + '\r\n\r\n' + body)});
      } else {
        testRunner.log('Continue request unchanged.');
        helper.allowRequest(event);
      }
      testRunner.log('');
    }
  };

  await helper.startInterceptionTest(requestInterceptedDict, Infinity, 'Both');

  var requestId = '';
  session.protocol.Network.onRequestWillBeSent(event => requestId = event.params.requestId);
  await new Promise(resolve => {
    session.protocol.Network.onResponseReceived(resolve);
    session.evaluate(`
      fetch('${testRunner.url('../resources/ping-redirect.php')}').then(r => r.text());
    `);
  });

  var result = await session.protocol.Network.getResponseBody({requestId: requestId});
  testRunner.log('Body content received by renderer:');
  testRunner.log(result.result.base64Encoded ? atob(result.result.body) : result.result.body);

  testRunner.completeTest();
})