Skip to content

Commit 571e64f

Browse files
committed
feat(client): add http cache and load failures
1 parent da9f98f commit 571e64f

File tree

9 files changed

+48
-11
lines changed

9 files changed

+48
-11
lines changed

client/lib/ResourceResponse.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import initializeConstantsAndProperties from 'awaited-dom/base/initializeConstan
22
import StateMachine from 'awaited-dom/base/StateMachine';
33
import IResourceHeaders from '@secret-agent/core-interfaces/IResourceHeaders';
44
import IResourceResponse from '@secret-agent/core-interfaces/IResourceResponse';
5+
import IHttpResourceLoadDetails from '@secret-agent/core-interfaces/IHttpResourceLoadDetails';
56
import CoreSession from './CoreTab';
67

78
const { getState, setState } = StateMachine<ResourceResponse, IState>();
@@ -18,6 +19,8 @@ const propertyKeys: (keyof ResourceResponse)[] = [
1819
'remoteAddress',
1920
'statusCode',
2021
'statusMessage',
22+
'browserLoadFailure',
23+
'browserServedFromCache',
2124
'data',
2225
];
2326

@@ -26,6 +29,16 @@ export default class ResourceResponse {
2629
initializeConstantsAndProperties(this, [], propertyKeys);
2730
}
2831

32+
public get browserServedFromCache(): Promise<
33+
null | IHttpResourceLoadDetails['browserServedFromCache']
34+
> {
35+
return getResponseProperty(this, 'browserServedFromCache');
36+
}
37+
38+
public get browserLoadFailure(): Promise<string> {
39+
return getResponseProperty(this, 'browserLoadFailure');
40+
}
41+
2942
public get headers(): Promise<IResourceHeaders> {
3043
return getResponseProperty(this, 'headers');
3144
}

core-interfaces/IHttpResourceLoadDetails.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default interface IHttpResourceLoadDetails {
3939
responseTrailers?: IResourceHeaders;
4040
resourceType?: ResourceType;
4141
browserRequestId?: string;
42-
browserServedFromCache?: 'service-worker' | 'disk' | 'prefetch' | 'unspecified';
42+
browserServedFromCache?: 'service-worker' | 'disk' | 'prefetch' | 'memory';
4343
browserLoadFailure?: string;
4444
browserBlockedReason?: string;
4545
browserCanceled?: boolean;

core-interfaces/IResourceResponse.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import IResourceHeaders from './IResourceHeaders';
2+
import IHttpResourceLoadDetails from './IHttpResourceLoadDetails';
23

34
export default interface IResourceResponse {
45
url: string;
56
timestamp: string;
67
headers: IResourceHeaders;
78
trailers?: IResourceHeaders;
9+
browserServedFromCache?: IHttpResourceLoadDetails['browserServedFromCache'];
10+
browserLoadFailure?: string;
811
remoteAddress: string;
912
statusCode: number;
1013
statusMessage?: string;

core/lib/SessionState.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@ export default class SessionState {
220220
const resource = this.resourceEventToMeta(tabId, resourceEvent);
221221
this.db.resources.insert(tabId, resource, null, resourceEvent, error);
222222

223+
if (!this.resources.some(x => x.id === resourceEvent.id)) {
224+
this.resources.push(resource);
225+
}
223226
const navigations = this.navigationsByTabId[tabId];
224227
if (!navigations) return;
225228

@@ -301,7 +304,7 @@ export default class SessionState {
301304
},
302305
} as IResourceMeta;
303306

304-
if (response?.statusCode) {
307+
if (response?.statusCode || response?.browserServedFromCache || response?.browserLoadFailure) {
305308
resource.response = response;
306309
if (response.url) resource.url = response.url;
307310
else resource.response.url = request.url;

core/models/ResourcesTable.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ export default class ResourcesTable extends SqliteTable<IResourcesRecord> {
6363
didBlockResource: boolean;
6464
browserRequestId?: string;
6565
isHttp2Push: boolean;
66-
browserServedFromCache?: 'service-worker' | 'disk' | 'prefetch' | 'unspecified';
67-
browserLoadFailure?: string;
6866
browserBlockedReason?: string;
6967
browserCanceled?: boolean;
7068
},
@@ -81,6 +79,12 @@ export default class ResourcesTable extends SqliteTable<IResourcesRecord> {
8179
...error,
8280
});
8381
}
82+
let contentEncoding: string;
83+
if (meta.response && meta.response.headers) {
84+
contentEncoding = <string>(
85+
(meta.response.headers['Content-Encoding'] ?? meta.response.headers['content-encoding'])
86+
);
87+
}
8488
return this.queuePendingInsert([
8589
meta.id,
8690
extras.browserRequestId,
@@ -101,7 +105,7 @@ export default class ResourcesTable extends SqliteTable<IResourcesRecord> {
101105
meta.response ? JSON.stringify(meta.response.headers ?? {}) : undefined,
102106
meta.response ? JSON.stringify(meta.response.trailers ?? {}) : undefined,
103107
meta.response?.timestamp,
104-
meta.response?.headers['Content-Encoding'] ?? meta.response?.headers['content-encoding'],
108+
contentEncoding,
105109
meta.response ? body : undefined,
106110
extras.socketId,
107111
extras.clientAlpn,
@@ -111,8 +115,8 @@ export default class ResourcesTable extends SqliteTable<IResourcesRecord> {
111115
extras.didBlockResource ? 1 : 0,
112116
JSON.stringify(extras.originalHeaders ?? {}),
113117
errorString,
114-
extras.browserServedFromCache,
115-
extras.browserLoadFailure,
118+
meta.response?.browserServedFromCache,
119+
meta.response?.browserLoadFailure,
116120
extras.browserBlockedReason,
117121
extras.browserCanceled ? 1 : 0,
118122
]);

mitm/handlers/RequestSession.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ export interface IRequestSessionResponseEvent extends IRequestSessionRequestEven
412412
body: Buffer;
413413
redirectedToUrl?: string;
414414
executionMillis: number;
415-
browserServedFromCache?: 'service-worker' | 'disk' | 'prefetch' | 'unspecified';
415+
browserServedFromCache?: IHttpResourceLoadDetails['browserServedFromCache'];
416416
browserLoadFailure?: string;
417417
browserBlockedReason?: string;
418418
browserCanceled?: boolean;

mitm/lib/MitmRequestContext.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ export default class MitmRequestContext {
159159
headers: ctx.responseHeaders,
160160
trailers: ctx.responseTrailers,
161161
timestamp: ctx.responseTime?.toISOString(),
162+
browserServedFromCache: ctx.browserServedFromCache,
163+
browserLoadFailure: ctx.browserLoadFailure,
162164
remoteAddress: ctx.remoteAddress,
163165
} as IResourceResponse;
164166

@@ -181,8 +183,6 @@ export default class MitmRequestContext {
181183
executionMillis: (ctx.responseTime ?? new Date()).getTime() - ctx.requestTime.getTime(),
182184
isHttp2Push: ctx.isHttp2Push,
183185
browserBlockedReason: ctx.browserBlockedReason,
184-
browserServedFromCache: ctx.browserServedFromCache,
185-
browserLoadFailure: ctx.browserLoadFailure,
186186
browserCanceled: ctx.browserCanceled,
187187
};
188188
}

puppet-chrome/lib/NetworkManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export class NetworkManager extends TypedEventEmitter<IPuppetNetworkEvents> {
273273
const { requestId } = event;
274274
const resource = this.requestsById.get(requestId);
275275
if (resource) {
276-
resource.browserServedFromCache = 'unspecified';
276+
resource.browserServedFromCache = 'memory';
277277
this.emitLoaded(requestId);
278278
}
279279
}

website/docs/Advanced/ResourceResponse.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@ Instances of this class are associated with a resource returned from `window.wai
66

77
## Properties
88

9+
### browserServedFromCache
10+
11+
Will have a value if http response was served from a browser cache.
12+
13+
#### **Returns** `Promise<null | 'service-worker' | 'disk' | 'prefetch' | 'memory'>`
14+
15+
### browserLoadFailure
16+
17+
Will have a value if an http error occurred loading this request.
18+
19+
#### **Returns** `Promise<string | null>`
20+
921
### headers
1022

1123
Retrieve the actual headers returned to the client (order and casing is preserved)
@@ -34,6 +46,8 @@ IPv4/6 and port of remote socket. `192.168.172.2:5001`
3446

3547
Http response status code.
3648

49+
NOTE: this value might be null if no HTTP response occurred, or an error occurred.
50+
3751
#### **Returns** `Promise<number>`
3852

3953
### statusText

0 commit comments

Comments
 (0)