feat(Network): implement request.redirectChain() api (#2194)

The request.redirectChain() returns all the requests issued to fetch
the resource.

Fixes #1816.
This commit is contained in:
Andrey Lushnikov
2018-03-15 17:17:38 -07:00
committed by GitHub
parent c4b1ac99b0
commit ec3025fe84
3 changed files with 65 additions and 9 deletions

View File

@@ -154,7 +154,7 @@ class NetworkManager extends EventEmitter {
const request = this._interceptionIdToRequest.get(event.interceptionId);
if (request) {
this._handleRequestRedirect(request, event.responseStatusCode, event.responseHeaders, false /* fromDiskCache */, false /* fromServiceWorker */, null /* securityDetails */);
this._handleRequestStart(request._requestId, event.interceptionId, event.redirectUrl, event.resourceType, event.request, event.frameId);
this._handleRequestStart(request._requestId, event.interceptionId, event.redirectUrl, event.resourceType, event.request, event.frameId, request._redirectChain);
}
return;
}
@@ -162,10 +162,10 @@ class NetworkManager extends EventEmitter {
const requestId = this._requestHashToRequestIds.firstValue(requestHash);
if (requestId) {
this._requestHashToRequestIds.delete(requestHash, requestId);
this._handleRequestStart(requestId, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId);
this._handleRequestStart(requestId, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId, []);
} else {
this._requestHashToInterceptionIds.set(requestHash, event.interceptionId);
this._handleRequestStart(null, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId);
this._handleRequestStart(null, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId, []);
}
}
@@ -189,6 +189,7 @@ class NetworkManager extends EventEmitter {
_handleRequestRedirect(request, redirectStatus, redirectHeaders, fromDiskCache, fromServiceWorker, securityDetails) {
const response = new Response(this._client, request, redirectStatus, redirectHeaders, fromDiskCache, fromServiceWorker, securityDetails);
request._response = response;
request._redirectChain.push(request);
this._requestIdToRequest.delete(request._requestId);
this._interceptionIdToRequest.delete(request._interceptionId);
this._attemptedAuthentications.delete(request._interceptionId);
@@ -203,12 +204,13 @@ class NetworkManager extends EventEmitter {
* @param {string} resourceType
* @param {!Object} requestPayload
* @param {?string} frameId
* @param {!Array<!Request>} redirectChain
*/
_handleRequestStart(requestId, interceptionId, url, resourceType, requestPayload, frameId) {
_handleRequestStart(requestId, interceptionId, url, resourceType, requestPayload, frameId, redirectChain) {
let frame = null;
if (frameId)
frame = this._frameManager.frame(frameId);
const request = new Request(this._client, requestId, interceptionId, this._userRequestInterceptionEnabled, url, resourceType, requestPayload, frame);
const request = new Request(this._client, requestId, interceptionId, this._userRequestInterceptionEnabled, url, resourceType, requestPayload, frame, redirectChain);
if (requestId)
this._requestIdToRequest.set(requestId, request);
if (interceptionId)
@@ -236,13 +238,16 @@ class NetworkManager extends EventEmitter {
}
return;
}
let redirectChain = [];
if (event.redirectResponse) {
const request = this._requestIdToRequest.get(event.requestId);
// If we connect late to the target, we could have missed the requestWillBeSent event.
if (request)
if (request) {
this._handleRequestRedirect(request, event.redirectResponse.status, event.redirectResponse.headers, event.redirectResponse.fromDiskCache, event.redirectResponse.fromServiceWorker, event.redirectResponse.securityDetails);
redirectChain = request._redirectChain;
}
}
this._handleRequestStart(event.requestId, null, event.request.url, event.type, event.request, event.frameId);
this._handleRequestStart(event.requestId, null, event.request.url, event.type, event.request, event.frameId, redirectChain);
}
/**
@@ -303,8 +308,9 @@ class Request {
* @param {string} resourceType
* @param {!Object} payload
* @param {?Puppeteer.Frame} frame
* @param {!Array<!Request>} redirectChain
*/
constructor(client, requestId, interceptionId, allowInterception, url, resourceType, payload, frame) {
constructor(client, requestId, interceptionId, allowInterception, url, resourceType, payload, frame, redirectChain) {
this._client = client;
this._requestId = requestId;
this._interceptionId = interceptionId;
@@ -322,6 +328,7 @@ class Request {
this._postData = payload.postData;
this._headers = {};
this._frame = frame;
this._redirectChain = redirectChain;
for (const key of Object.keys(payload.headers))
this._headers[key.toLowerCase()] = payload.headers[key];
@@ -377,6 +384,13 @@ class Request {
return this._frame;
}
/**
* @return {!Array<!Request>}
*/
redirectChain() {
return this._redirectChain.slice();
}
/**
* @return {?{errorText: string}}
*/