Skip to content

Commit

Permalink
fix: correctly report overridden headers on redirected requests (#31409)
Browse files Browse the repository at this point in the history
Fixes #31351
  • Loading branch information
yury-s committed Jun 22, 2024
1 parent 2285bcd commit d74ddae
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
15 changes: 9 additions & 6 deletions packages/playwright-core/src/server/chromium/crNetworkManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,12 +332,13 @@ export class CRNetworkManager {
}

let route = null;
let headersOverride: types.HeadersArray | undefined;
if (requestPausedEvent) {
// We do not support intercepting redirects.
if (redirectedFrom || (!this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled)) {
// Chromium does not preserve header overrides between redirects, so we have to do it ourselves.
const headers = redirectedFrom?._originalRequestRoute?._alreadyContinuedParams?.headers;
requestPausedSessionInfo!.session._sendMayFail('Fetch.continueRequest', { requestId: requestPausedEvent.requestId, headers });
headersOverride = redirectedFrom?._originalRequestRoute?._alreadyContinuedParams?.headers;
requestPausedSessionInfo!.session._sendMayFail('Fetch.continueRequest', { requestId: requestPausedEvent.requestId, headers: headersOverride });
} else {
route = new RouteImpl(requestPausedSessionInfo!.session, requestPausedEvent.requestId);
}
Expand All @@ -353,15 +354,16 @@ export class CRNetworkManager {
route,
requestWillBeSentEvent,
requestPausedEvent,
redirectedFrom
redirectedFrom,
headersOverride: headersOverride || null,
});
this._requestIdToRequest.set(requestWillBeSentEvent.requestId, request);

if (requestPausedEvent) {
// We will not receive extra info when intercepting the request.
// Use the headers from the Fetch.requestPausedPayload and release the allHeaders()
// right away, so that client can call it from the route handler.
request.request.setRawRequestHeaders(headersObjectToArray(requestPausedEvent.request.headers, '\n'));
request.request.setRawRequestHeaders(headersOverride ?? headersObjectToArray(requestPausedEvent.request.headers, '\n'));
}
(this._page?._frameManager || this._serviceWorker)!.requestStarted(request.request, route || undefined);
}
Expand Down Expand Up @@ -568,8 +570,9 @@ class InterceptableRequest {
requestWillBeSentEvent: Protocol.Network.requestWillBeSentPayload;
requestPausedEvent: Protocol.Fetch.requestPausedPayload | undefined;
redirectedFrom: InterceptableRequest | null;
headersOverride: types.HeadersArray | null;
}) {
const { session, context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker } = options;
const { session, context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker, headersOverride } = options;
this.session = session;
this._timestamp = requestWillBeSentEvent.timestamp;
this._wallTime = requestWillBeSentEvent.wallTime;
Expand All @@ -591,7 +594,7 @@ class InterceptableRequest {
if (entries && entries.length)
postDataBuffer = Buffer.concat(entries.map(entry => Buffer.from(entry.bytes!, 'base64')));

this.request = new network.Request(context, frame, serviceWorker, redirectedFrom?.request || null, documentId, url, type, method, postDataBuffer, headersObjectToArray(headers));
this.request = new network.Request(context, frame, serviceWorker, redirectedFrom?.request || null, documentId, url, type, method, postDataBuffer, headersOverride || headersObjectToArray(headers));
}
}

Expand Down
21 changes: 21 additions & 0 deletions tests/page/page-request-continue.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,27 @@ it('continue should propagate headers to redirects', async ({ page, server, brow
expect(serverRequest.headers['custom']).toBe('value');
});

it('redirected requests should report overridden headers', {
annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/31351' }
}, async ({ page, server, browserName }) => {
it.fixme(browserName === 'firefox');
await server.setRedirect('/redirect', '/empty.html');
await page.route('**/redirect', route => {
const headers = route.request().headers();
headers['custom'] = 'value';
void route.fallback({ headers });
});

const [serverRequest, response] = await Promise.all([
server.waitForRequest('/empty.html'),
page.goto(server.PREFIX + '/redirect')
]);
expect(serverRequest.headers['custom']).toBe('value');
expect(response.request().url()).toBe(server.EMPTY_PAGE);
expect(response.request().headers()['custom']).toBe('value');
expect((await response.request().allHeaders())['custom']).toBe('value');
});

it('continue should delete headers on redirects', async ({ page, server, browserName }) => {
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/13106' });
it.fixme(browserName === 'firefox');
Expand Down

0 comments on commit d74ddae

Please sign in to comment.