diff --git a/packages/playwright-core/src/common/netUtils.ts b/packages/playwright-core/src/common/netUtils.ts index 2b33e304c5..4cfca7c69f 100644 --- a/packages/playwright-core/src/common/netUtils.ts +++ b/packages/playwright-core/src/common/netUtils.ts @@ -39,11 +39,14 @@ export type HTTPRequestParams = { timeout?: number, }; +export const NET_DEFAULT_TIMEOUT = 30_000; + export function httpRequest(params: HTTPRequestParams, onResponse: (r: http.IncomingMessage) => void, onError: (error: Error) => void) { const parsedUrl = URL.parse(params.url); let options: https.RequestOptions = { ...parsedUrl }; options.method = params.method || 'GET'; options.headers = params.headers; + const timeout = params.timeout ?? NET_DEFAULT_TIMEOUT; const proxyURL = getProxyForUrl(params.url); if (proxyURL) { @@ -74,16 +77,16 @@ export function httpRequest(params: HTTPRequestParams, onResponse: (r: http.Inco https.request(options, requestCallback) : http.request(options, requestCallback); request.on('error', onError); - if (params.timeout !== undefined) { + if (timeout !== undefined) { const rejectOnTimeout = () => { - onError(new Error(`Request to ${params.url} timed out after ${params.timeout}ms`)); + onError(new Error(`Request to ${params.url} timed out after ${timeout}ms`)); request.abort(); }; - if (params.timeout <= 0) { + if (timeout <= 0) { rejectOnTimeout(); return; } - request.setTimeout(params.timeout, rejectOnTimeout); + request.setTimeout(timeout, rejectOnTimeout); } request.end(params.data); } diff --git a/packages/playwright-core/src/server/chromium/chromium.ts b/packages/playwright-core/src/server/chromium/chromium.ts index 91d699f5a4..3633eceab5 100644 --- a/packages/playwright-core/src/server/chromium/chromium.ts +++ b/packages/playwright-core/src/server/chromium/chromium.ts @@ -32,6 +32,7 @@ import { Browser } from '../browser'; import type * as types from '../types'; import type * as channels from '../../protocol/channels'; import type { HTTPRequestParams } from '../../common/netUtils'; +import { NET_DEFAULT_TIMEOUT } from '../../common/netUtils'; import { fetchData } from '../../common/netUtils'; import { getUserAgent } from '../../common/userAgent'; import { debugMode, headersArrayToObject, streamToString, wrapInASCIIBox } from '../../utils'; @@ -365,7 +366,9 @@ async function urlToWSEndpoint(progress: Progress, endpointURL: string) { const httpURL = endpointURL.endsWith('/') ? `${endpointURL}json/version/` : `${endpointURL}/json/version/`; const request = endpointURL.startsWith('https') ? https : http; const json = await new Promise((resolve, reject) => { - request.get(httpURL, resp => { + request.get(httpURL, { + timeout: NET_DEFAULT_TIMEOUT, + }, resp => { if (resp.statusCode! < 200 || resp.statusCode! >= 400) { reject(new Error(`Unexpected status ${resp.statusCode} when connecting to ${httpURL}.\n` + `This does not look like a DevTools server, try connecting via ws://.`));