diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts index 5a31e90b2bc44231aa33ac353cec99a855aeabf2..7cc5bc301f6c01a5820f46c40cb02e35dd8d8689 100644 --- a/lib/datasource/docker/index.ts +++ b/lib/datasource/docker/index.ts @@ -1,4 +1,3 @@ -import { OutgoingHttpHeaders } from 'http'; import URL from 'url'; import { ECR } from '@aws-sdk/client-ecr'; import hasha from 'hasha'; @@ -11,6 +10,7 @@ import { ExternalHostError } from '../../types/errors/external-host-error'; import * as packageCache from '../../util/cache/package'; import * as hostRules from '../../util/host-rules'; import { Http, HttpResponse } from '../../util/http'; +import type { OutgoingHttpHeaders } from '../../util/http/types'; import { ensureTrailingSlash, trimTrailingSlash } from '../../util/url'; import * as dockerVersioning from '../../versioning/docker'; import type { GetReleasesConfig, ReleaseResult } from '../types'; diff --git a/lib/datasource/gradle-version/index.ts b/lib/datasource/gradle-version/index.ts index b9a0a29ca675633817be66eee1df9f87850a7fdb..6638ea55b5f01f179a0f8ab3f9cd7f43dded21e8 100644 --- a/lib/datasource/gradle-version/index.ts +++ b/lib/datasource/gradle-version/index.ts @@ -1,5 +1,6 @@ import { ExternalHostError } from '../../types/errors/external-host-error'; -import { Http, HttpError } from '../../util/http'; +import { Http } from '../../util/http'; +import { HttpError } from '../../util/http/types'; import { regEx } from '../../util/regex'; import * as gradleVersioning from '../../versioning/gradle'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; diff --git a/lib/datasource/npm/npmrc.ts b/lib/datasource/npm/npmrc.ts index c366b8e2a1ead3af8f49b91d9f4ca783f2fe6920..7afc4c89b13e5277aaa463b6b3d034198bcc5f17 100644 --- a/lib/datasource/npm/npmrc.ts +++ b/lib/datasource/npm/npmrc.ts @@ -1,4 +1,3 @@ -import { OutgoingHttpHeaders } from 'http'; import url from 'url'; import is from '@sindresorhus/is'; import ini from 'ini'; @@ -6,6 +5,7 @@ import registryAuthToken from 'registry-auth-token'; import getRegistryUrl from 'registry-auth-token/registry-url'; import { getAdminConfig } from '../../config/admin'; import { logger } from '../../logger'; +import type { OutgoingHttpHeaders } from '../../util/http/types'; import { maskToken } from '../../util/mask'; import { add } from '../../util/sanitize'; diff --git a/lib/datasource/pod/index.ts b/lib/datasource/pod/index.ts index dd2d050815c175746bb307dc9f460efb0769a418..c231142d9a67070e83e5223adae42f5475ed3f21 100644 --- a/lib/datasource/pod/index.ts +++ b/lib/datasource/pod/index.ts @@ -3,8 +3,9 @@ import { HOST_DISABLED } from '../../constants/error-messages'; import { logger } from '../../logger'; import { ExternalHostError } from '../../types/errors/external-host-error'; import * as packageCache from '../../util/cache/package'; -import { Http, HttpError } from '../../util/http'; +import { Http } from '../../util/http'; import { GithubHttp } from '../../util/http/github'; +import type { HttpError } from '../../util/http/types'; import type { GetReleasesConfig, ReleaseResult } from '../types'; export const id = 'pod'; diff --git a/lib/datasource/rubygems/get.ts b/lib/datasource/rubygems/get.ts index 2525bff001279fdadd03c1c047984ffd4d9b6172..71546019caea2e5d763e4689b905f9b6707c47a9 100644 --- a/lib/datasource/rubygems/get.ts +++ b/lib/datasource/rubygems/get.ts @@ -1,7 +1,7 @@ -import { OutgoingHttpHeaders } from 'http'; import urlJoin from 'url-join'; import { logger } from '../../logger'; import { Http } from '../../util/http'; +import type { OutgoingHttpHeaders } from '../../util/http/types'; import type { ReleaseResult } from '../types'; import { id } from './common'; diff --git a/lib/util/http/index.ts b/lib/util/http/index.ts index a968ab9fbad12fbd3a5a62cc76d77f2f94e9ff9a..fe014f8d426d2da1546e78a64ba7d78216345e6f 100644 --- a/lib/util/http/index.ts +++ b/lib/util/http/index.ts @@ -1,4 +1,5 @@ import crypto from 'crypto'; +import merge from 'deepmerge'; import got, { Options, Response } from 'got'; import { HOST_DISABLED } from '../../constants/error-messages'; import { logger } from '../../logger'; @@ -9,17 +10,11 @@ import { resolveBaseUrl } from '../url'; import { applyAuthorization, removeAuthorization } from './auth'; import { applyHostRules } from './host-rules'; import { getQueue } from './queue'; -import { GotOptions, RequestStats } from './types'; +import type { GotOptions, OutgoingHttpHeaders, RequestStats } from './types'; // TODO: refactor code to remove this import './legacy'; -export * from './types'; - -interface OutgoingHttpHeaders { - [header: string]: number | string | string[] | undefined; -} - export interface HttpOptions { body?: any; username?: string; @@ -95,13 +90,16 @@ export class Http<GetOptions = HttpOptions, PostOptions = HttpPostOptions> { if (httpOptions?.baseUrl) { url = resolveBaseUrl(httpOptions.baseUrl, url); } - // TODO: deep merge in order to merge headers - let options: GotOptions = { - method: 'get', - ...this.options, - hostType: this.hostType, - ...httpOptions, - } as unknown; // TODO: fixme + + let options: GotOptions = merge<GotOptions>( + { + method: 'get', + ...this.options, + hostType: this.hostType, + }, + httpOptions + ); + if (process.env.NODE_ENV === 'test') { options.retry = 0; } diff --git a/lib/util/http/types.ts b/lib/util/http/types.ts index 63a53e4e2a78c2d060ada9d561b902071b89d609..9ec9a273fd8dbaa290b7e69b1b74c823bba26972 100644 --- a/lib/util/http/types.ts +++ b/lib/util/http/types.ts @@ -23,3 +23,5 @@ export interface RequestStats { duration: number; queueDuration: number; } + +export type OutgoingHttpHeaders = Record<string, string | string[] | undefined>; diff --git a/lib/workers/repository/stats.ts b/lib/workers/repository/stats.ts index a319cba082aa7bf0f08877fd08ff4ff78b2eb325..7384796e3efeac8603da72a95b927d0d197fd0ec 100644 --- a/lib/workers/repository/stats.ts +++ b/lib/workers/repository/stats.ts @@ -1,7 +1,7 @@ import URL from 'url'; import { logger } from '../../logger'; import * as memCache from '../../util/cache/memory'; -import { RequestStats } from '../../util/http'; +import type { RequestStats } from '../../util/http/types'; export function printRequestStats(): void { const httpRequests = memCache.get<RequestStats[]>('http-requests');