///
import * as coreHttp from "http";
import * as coreHttps from "https";
import { Writable } from "stream";
import { URL } from "url";
export interface WrappableRequest {
getHeader?(...args: any[]): any;
setHeader(...args: any[]): any;
removeHeader(...args: any[]): any;
abort?(...args: any[]): any;
flushHeaders?(...args: any[]): any;
setNoDelay?(...args: any[]): any;
setSocketKeepAlive?(...args: any[]): any;
setTimeout?(...args: any[]): any;
}
export interface WrappableResponse {
statusCode?: number | undefined;
headers: {
location?: string | undefined;
};
destroy(): any;
}
export interface Scheme {
request(options: Options, callback?: (res: Response) => any): Request;
}
export interface RedirectableRequest extends Writable {
setHeader: Request["setHeader"];
removeHeader: Request["removeHeader"];
abort: Request["abort"];
flushHeaders: Request["flushHeaders"];
getHeader: Request["getHeader"];
setNoDelay: Request["setNoDelay"];
setSocketKeepAlive: Request["setSocketKeepAlive"];
setTimeout: Request["setTimeout"];
addListener(event: string, listener: (...args: any[]) => void): this;
addListener(event: "response", listener: (response: Response) => void): this;
addListener(event: "error", listener: (err: Error) => void): this;
emit(event: string | symbol, ...args: any[]): boolean;
emit(event: "response", response: Response): boolean;
emit(event: "error", err: Error): boolean;
on(event: string, listener: (...args: any[]) => void): this;
on(event: "response", listener: (response: Response) => void): this;
on(event: "error", listener: (err: Error) => void): this;
once(event: string, listener: (...args: any[]) => void): this;
once(event: "response", listener: (response: Response) => void): this;
once(event: "error", listener: (err: Error) => void): this;
prependListener(event: string, listener: (...args: any[]) => void): this;
prependListener(event: "response", listener: (response: Response) => void): this;
prependListener(event: "error", listener: (err: Error) => void): this;
prependOnceListener(event: string, listener: (...args: any[]) => void): this;
prependOnceListener(event: "response", listener: (response: Response) => void): this;
prependOnceListener(event: "error", listener: (err: Error) => void): this;
}
export interface RedirectScheme {
/**
* This function has two overloads:
* ```typescript
* request(options: string | URL | Options, callback)
* request(url: string | URL, options: Options, callback)
* ```
*/
request(
url: string | URL | (Options & FollowOptions),
options?: (Options & FollowOptions) | ((res: Response & FollowResponse) => void),
callback?: (res: Response & FollowResponse) => void,
): RedirectableRequest;
/**
* This function has two overloads:
* ```typescript
* get(options: string | URL | Options, callback)
* get(url: string | URL, options: Options, callback)
* ```
*/
get(
url: string | URL | (Options & FollowOptions),
options?: (Options & FollowOptions) | ((res: Response & FollowResponse) => void),
callback?: (res: Response & FollowResponse) => void,
): RedirectableRequest;
}
export type Override = Pick> & U;
export interface FollowOptions {
followRedirects?: boolean | undefined;
maxRedirects?: number | undefined;
maxBodyLength?: number | undefined;
beforeRedirect?:
| ((options: Options & FollowOptions, responseDetails: ResponseDetails) => void)
| undefined;
agents?:
| {
http?: coreHttp.Agent | undefined;
https?: coreHttps.Agent | undefined;
}
| undefined;
trackRedirects?: boolean | undefined;
}
export interface FollowResponse {
responseUrl: string;
redirects: Redirect[];
}
export interface Redirect {
url: string;
headers: coreHttp.IncomingHttpHeaders;
statusCode: number;
}
export interface ResponseDetails {
headers: coreHttp.IncomingHttpHeaders;
}
export const http: Override<
typeof coreHttp,
RedirectScheme
>;
export const https: Override<
typeof coreHttps,
RedirectScheme
>;
export type WrappedScheme> = Override<
T,
RedirectScheme<
T extends Scheme ? Options : never,
T extends Scheme ? Request : never,
T extends Scheme ? Response : never
>
>;
export function wrap }>(
protocols: T,
): {
[K in keyof T]: WrappedScheme;
};