Skip to content

Commit

Permalink
core(network-recorder): handle QUIC requests
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickhulce committed May 17, 2018
1 parent b19a7b5 commit 671b2af
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 2 deletions.
10 changes: 8 additions & 2 deletions lighthouse-core/lib/network-recorder.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,15 @@ class NetworkRecorder extends EventEmitter {
return;
}

// QUIC network requests don't always "finish" even when they're done loading data
// Use receivedHeaders instead, see https://github.com/GoogleChrome/lighthouse/issues/5254
const isQUIC = record._responseHeaders && record._responseHeaders
.find(header => header.name.toLowerCase() === 'alt-svc' && /quic/.test(header.value));
const receivedHeaders = record._timing && record._timing.receiveHeadersEnd > 0;

// convert the network record timestamp to ms
timeBoundaries.push({time: record.startTime * 1000, isStart: true});
if (record.finished) {
if (record.finished || (isQUIC && receivedHeaders && record.endTime)) {
timeBoundaries.push({time: record.endTime * 1000, isStart: false});
}
});
Expand All @@ -119,7 +125,7 @@ class NetworkRecorder extends EventEmitter {
.sort((a, b) => a.time - b.time);

let numInflightRequests = 0;
let quietPeriodStart = 0;
let quietPeriodStart = -Infinity;
/** @type {Array<{start: number, end: number}>} */
const quietPeriods = [];
timeBoundaries.forEach(boundary => {
Expand Down
97 changes: 97 additions & 0 deletions lighthouse-core/test/gather/network-recorder-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,101 @@ describe('network recorder', function() {
const records = NetworkRecorder.recordsFromLogs(devtoolsLogItems);
assert.equal(records.length, 76);
});

describe('#findNetworkQuietPeriods', () => {
function record(data) {
const url = data.url || 'https://example.com';
const scheme = url.split(':')[0];
return Object.assign({
url,
finished: !!data.endTime,
parsedURL: {scheme},
}, data);
}

it('should find the 0-quiet periods', () => {
const records = [
record({startTime: 0, endTime: 1}),
record({startTime: 2, endTime: 3}),
record({startTime: 4, endTime: 5}),
];

const periods = NetworkRecorder.findNetworkQuietPeriods(records, 0);
assert.deepStrictEqual(periods, [
{start: -Infinity, end: 0},
{start: 1000, end: 2000},
{start: 3000, end: 4000},
{start: 5000, end: Infinity},
]);
});

it('should find the 2-quiet periods', () => {
const records = [
record({startTime: 0, endTime: 1.5}),
record({startTime: 0, endTime: 2}),
record({startTime: 0, endTime: 2.5}),
record({startTime: 2, endTime: 3}),
record({startTime: 4, endTime: 5}),
];

const periods = NetworkRecorder.findNetworkQuietPeriods(records, 2);
assert.deepStrictEqual(periods, [
{start: -Infinity, end: 0},
{start: 1500, end: Infinity},
]);
});

it('should handle unfinished requests', () => {
const records = [
record({startTime: 0, endTime: 1.5}),
record({startTime: 0, endTime: 2}),
record({startTime: 0, endTime: 2.5}),
record({startTime: 2, endTime: 3}),
record({startTime: 2}),
record({startTime: 2}),
record({startTime: 4, endTime: 5}),
record({startTime: 5.5}),
];

const periods = NetworkRecorder.findNetworkQuietPeriods(records, 2);
assert.deepStrictEqual(periods, [
{start: -Infinity, end: 0},
{start: 1500, end: 2000},
{start: 3000, end: 4000},
{start: 5000, end: 5500},
]);
});

it('should ignore data URIs', () => {
const records = [
record({startTime: 0, endTime: 1}),
record({startTime: 0, endTime: 2, url: 'data:image/png;base64,'}),
];

const periods = NetworkRecorder.findNetworkQuietPeriods(records, 0);
assert.deepStrictEqual(periods, [
{start: -Infinity, end: 0},
{start: 1000, end: Infinity},
]);
});

it('should handle QUIC requests', () => {
const quicRequest = {
finished: false,
_responseHeaders: [{name: 'ALT-SVC', value: 'hq=":49288";quic="1,1abadaba,51303334,0"'}],
_timing: {receiveHeadersEnd: 1.28},
};

const records = [
record({startTime: 0, endTime: 1}),
record({startTime: 0, endTime: 2, ...quicRequest}),
];

const periods = NetworkRecorder.findNetworkQuietPeriods(records, 0);
assert.deepStrictEqual(periods, [
{start: -Infinity, end: 0},
{start: 2000, end: Infinity},
]);
});
});
});

0 comments on commit 671b2af

Please sign in to comment.