1 | /**
|
2 | * @license
|
3 | * Copyright 2023 Google Inc.
|
4 | * SPDX-License-Identifier: Apache-2.0
|
5 | */
|
6 |
|
7 | import type Protocol from 'devtools-protocol';
|
8 |
|
9 | import type {SecurityDetails} from '../common/SecurityDetails.js';
|
10 |
|
11 | import type {Frame} from './Frame.js';
|
12 | import type {HTTPRequest} from './HTTPRequest.js';
|
13 |
|
14 | /**
|
15 | * @public
|
16 | */
|
17 | export interface RemoteAddress {
|
18 | ip?: string;
|
19 | port?: number;
|
20 | }
|
21 |
|
22 | /**
|
23 | * The HTTPResponse class represents responses which are received by the
|
24 | * {@link Page} class.
|
25 | *
|
26 | * @public
|
27 | */
|
28 | export abstract class HTTPResponse {
|
29 | /**
|
30 | * @internal
|
31 | */
|
32 | constructor() {}
|
33 |
|
34 | /**
|
35 | * The IP address and port number used to connect to the remote
|
36 | * server.
|
37 | */
|
38 | abstract remoteAddress(): RemoteAddress;
|
39 |
|
40 | /**
|
41 | * The URL of the response.
|
42 | */
|
43 | abstract url(): string;
|
44 |
|
45 | /**
|
46 | * True if the response was successful (status in the range 200-299).
|
47 | */
|
48 | ok(): boolean {
|
49 | // TODO: document === 0 case?
|
50 | const status = this.status();
|
51 | return status === 0 || (status >= 200 && status <= 299);
|
52 | }
|
53 |
|
54 | /**
|
55 | * The status code of the response (e.g., 200 for a success).
|
56 | */
|
57 | abstract status(): number;
|
58 |
|
59 | /**
|
60 | * The status text of the response (e.g. usually an "OK" for a
|
61 | * success).
|
62 | */
|
63 | abstract statusText(): string;
|
64 |
|
65 | /**
|
66 | * An object with HTTP headers associated with the response. All
|
67 | * header names are lower-case.
|
68 | */
|
69 | abstract headers(): Record<string, string>;
|
70 |
|
71 | /**
|
72 | * {@link SecurityDetails} if the response was received over the
|
73 | * secure connection, or `null` otherwise.
|
74 | */
|
75 | abstract securityDetails(): SecurityDetails | null;
|
76 |
|
77 | /**
|
78 | * Timing information related to the response.
|
79 | */
|
80 | abstract timing(): Protocol.Network.ResourceTiming | null;
|
81 |
|
82 | /**
|
83 | * Promise which resolves to a buffer with response body.
|
84 | *
|
85 | * @remarks
|
86 | *
|
87 | * The buffer might be re-encoded by the browser
|
88 | * based on HTTP-headers or other heuristics. If the browser
|
89 | * failed to detect the correct encoding, the buffer might
|
90 | * be encoded incorrectly. See https://github.com/puppeteer/puppeteer/issues/6478.
|
91 | */
|
92 | abstract content(): Promise<Uint8Array>;
|
93 |
|
94 | /**
|
95 | * {@inheritDoc HTTPResponse.content}
|
96 | */
|
97 | async buffer(): Promise<Buffer> {
|
98 | const content = await this.content();
|
99 | return Buffer.from(content);
|
100 | }
|
101 | /**
|
102 | * Promise which resolves to a text (utf8) representation of response body.
|
103 | */
|
104 | async text(): Promise<string> {
|
105 | const content = await this.content();
|
106 | return new TextDecoder().decode(content);
|
107 | }
|
108 |
|
109 | /**
|
110 | * Promise which resolves to a JSON representation of response body.
|
111 | *
|
112 | * @remarks
|
113 | *
|
114 | * This method will throw if the response body is not parsable via
|
115 | * `JSON.parse`.
|
116 | */
|
117 | async json(): Promise<any> {
|
118 | const content = await this.text();
|
119 | return JSON.parse(content);
|
120 | }
|
121 |
|
122 | /**
|
123 | * A matching {@link HTTPRequest} object.
|
124 | */
|
125 | abstract request(): HTTPRequest;
|
126 |
|
127 | /**
|
128 | * True if the response was served from either the browser's disk
|
129 | * cache or memory cache.
|
130 | */
|
131 | abstract fromCache(): boolean;
|
132 |
|
133 | /**
|
134 | * True if the response was served by a service worker.
|
135 | */
|
136 | abstract fromServiceWorker(): boolean;
|
137 |
|
138 | /**
|
139 | * A {@link Frame} that initiated this response, or `null` if
|
140 | * navigating to error pages.
|
141 | */
|
142 | abstract frame(): Frame | null;
|
143 | }
|