123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- import * as https from 'https';
- import * as http from 'http';
- import { IncomingHttpHeaders, OutgoingHttpHeaders } from 'http';
- import * as url from 'url';
- import { Readable, Writable } from 'stream';
- import { EventEmitter } from 'events';
- import { LookupFunction } from 'net';
- export { IncomingHttpHeaders, OutgoingHttpHeaders };
- export type HttpMethod = "GET" | "POST" | "DELETE" | "PUT" | "HEAD" | "OPTIONS" | "PATCH" | "TRACE" | "CONNECT";
- export as namespace urllib;
- export interface RequestOptions {
- /** Request method, defaults to GET. Could be GET, POST, DELETE or PUT. Alias 'type'. */
- method?: HttpMethod;
- /** Alias method */
- type?: HttpMethod;
- /** Data to be sent. Will be stringify automatically. */
- data?: any;
- /** Force convert data to query string. */
- dataAsQueryString?: boolean;
- /** Manually set the content of payload. If set, data will be ignored. */
- content?: string | Buffer;
- /** Stream to be pipe to the remote.If set, data and content will be ignored. */
- stream?: Readable;
- /**
- * A writable stream to be piped by the response stream.
- * Responding data will be write to this stream and callback
- * will be called with data set null after finished writing.
- */
- writeStream?: Writable;
- /** consume the writeStream, invoke the callback after writeStream close. */
- consumeWriteStream?: boolean;
- /**
- * The files will send with multipart/form-data format, base on formstream.
- * If method not set, will use POST method by default.
- */
- files?: Array<Readable | Buffer | string> | object | Readable | Buffer | string;
- /** Type of request data.Could be json.If it's json, will auto set Content-Type: application/json header. */
- contentType?: string;
- /**
- * urllib default use querystring to stringify form data which don't support nested object,
- * will use qs instead of querystring to support nested object by set this option to true.
- */
- nestedQuerystring?: boolean;
- /**
- * Type of response data. Could be text or json.
- * If it's text, the callbacked data would be a String.
- * If it's json, the data of callback would be a parsed JSON Object
- * and will auto set Accept: application/json header. Default callbacked data would be a Buffer.
- */
- dataType?: string;
- /** Fix the control characters (U+0000 through U+001F) before JSON parse response. Default is false. */
- fixJSONCtlChars?: boolean;
- /** Request headers. */
- headers?: IncomingHttpHeaders;
- /** by default will convert header keys to lowercase */
- keepHeaderCase?: boolean;
- /**
- * Request timeout in milliseconds for connecting phase and response receiving phase.
- * Defaults to exports.
- * TIMEOUT, both are 5s.You can use timeout: 5000 to tell urllib use same timeout on two phase or set them seperately such as
- * timeout: [3000, 5000], which will set connecting timeout to 3s and response 5s.
- */
- timeout?: number | number[];
- /** username:password used in HTTP Basic Authorization. */
- auth?: string;
- /** username:password used in HTTP Digest Authorization. */
- digestAuth?: string;
- /** HTTP Agent object.Set false if you does not use agent. */
- agent?: http.Agent;
- /** HTTPS Agent object. Set false if you does not use agent. */
- httpsAgent?: https.Agent;
- /**
- * An array of strings or Buffers of trusted certificates.
- * If this is omitted several well known "root" CAs will be used, like VeriSign.
- * These are used to authorize connections.
- * Notes: This is necessary only if the server uses the self - signed certificate
- */
- ca?: string | Buffer | string[] | Buffer[];
- /**
- * If true, the server certificate is verified against the list of supplied CAs.
- * An 'error' event is emitted if verification fails.Default: true.
- */
- rejectUnauthorized?: boolean;
- /** A string or Buffer containing the private key, certificate and CA certs of the server in PFX or PKCS12 format. */
- pfx?: string | Buffer;
- /**
- * A string or Buffer containing the private key of the client in PEM format.
- * Notes: This is necessary only if using the client certificate authentication
- */
- key?: string | Buffer;
- /**
- * A string or Buffer containing the certificate key of the client in PEM format.
- * Notes: This is necessary only if using the client certificate authentication
- */
- cert?: string | Buffer;
- /** A string of passphrase for the private key or pfx. */
- passphrase?: string;
- /** A string describing the ciphers to use or exclude. */
- ciphers?: string;
- /** The SSL method to use, e.g.SSLv3_method to force SSL version 3. */
- secureProtocol?: string;
- /** follow HTTP 3xx responses as redirects. defaults to false. */
- followRedirect?: boolean;
- /** The maximum number of redirects to follow, defaults to 10. */
- maxRedirects?: number;
- /** Format the redirect url by your self. Default is url.resolve(from, to). */
- formatRedirectUrl?: (a: any, b: any) => void;
- /** Before request hook, you can change every thing here. */
- beforeRequest?: (...args: any[]) => void;
- /** let you get the res object when request connected, default false. alias customResponse */
- streaming?: boolean;
- /** Accept gzip response content and auto decode it, default is false. */
- gzip?: boolean;
- /** Enable timing or not, default is false. */
- timing?: boolean;
- /** Enable proxy request, default is false. */
- enableProxy?: boolean;
- /** proxy agent uri or options, default is null. */
- proxy?: string | { [key: string]: any };
- /**
- * Custom DNS lookup function, default is dns.lookup.
- * Require node >= 4.0.0(for http protocol) and node >=8(for https protocol)
- */
- lookup?: LookupFunction;
- /**
- * check request address to protect from SSRF and similar attacks.
- * It receive two arguments(ip and family) and should return true or false to identified the address is legal or not.
- * It rely on lookup and have the same version requirement.
- */
- checkAddress?: (ip: string, family: number | string) => boolean;
- /**
- * UNIX domain socket path. (Windows is not supported)
- */
- socketPath?: string;
- }
- export interface HttpClientResponse<T> {
- data: T;
- status: number;
- headers: OutgoingHttpHeaders;
- res: http.IncomingMessage & {
- /**
- * https://eggjs.org/en/core/httpclient.html#timing-boolean
- */
- timing?: {
- queuing: number;
- dnslookup: number;
- connected: number;
- requestSent: number;
- waiting: number;
- contentDownload: number;
- }
- };
- }
- /**
- * @param data Outgoing message
- * @param res http response
- */
- export type Callback<T> = (err: Error, data: T, res: http.IncomingMessage) => void;
- /**
- * Handle all http request, both http and https support well.
- *
- * @example
- * // GET http://httptest.cnodejs.net
- * urllib.request('http://httptest.cnodejs.net/test/get', function(err, data, res) {});
- * // POST http://httptest.cnodejs.net
- * var args = { type: 'post', data: { foo: 'bar' } };
- * urllib.request('http://httptest.cnodejs.net/test/post', args, function(err, data, res) {});
- *
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function request<T = any>(url: string | url.URL, options?: RequestOptions): Promise<HttpClientResponse<T>>;
- /**
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function request<T = any>(url: string | url.URL, callback: Callback<T>): void;
- /**
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function request<T = any>(url: string | url.URL, options: RequestOptions, callback: Callback<T>): void;
- /**
- * Handle request with a callback.
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function requestWithCallback<T = any>(url: string | url.URL, callback: Callback<T>): void;
- /**
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function requestWithCallback<T = any>(url: string | url.URL, options: RequestOptions, callback: Callback<T>): void;
- /**
- * yield urllib.requestThunk(url, args)
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function requestThunk<T = any>(url: string | url.URL, options?: RequestOptions): (callback: Callback<T>) => void;
- /**
- * alias to request.
- * Handle all http request, both http and https support well.
- *
- * @example
- * // GET http://httptest.cnodejs.net
- * urllib.request('http://httptest.cnodejs.net/test/get', function(err, data, res) {});
- * // POST http://httptest.cnodejs.net
- * var args = { type: 'post', data: { foo: 'bar' } };
- * urllib.request('http://httptest.cnodejs.net/test/post', args, function(err, data, res) {});
- *
- * @param url The URL to request, either a String or a Object that return by url.parse.
- * @param options Optional, @see RequestOptions.
- */
- export function curl<T = any>(url: string | url.URL, options?: RequestOptions): Promise<HttpClientResponse<T>>;
- /**
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function curl<T = any>(url: string | url.URL, callback: Callback<T>): void;
- /**
- * @param url The URL to request, either a String or a Object that return by url.parse.
- */
- export function curl<T = any>(url: string | url.URL, options: RequestOptions, callback: Callback<T>): void;
- /**
- * The default request timeout(in milliseconds).
- */
- export const TIMEOUT: number;
- /**
- * The default request & response timeout(in milliseconds).
- */
- export const TIMEOUTS: [number, number];
- /**
- * Request user agent.
- */
- export const USER_AGENT: string;
- /**
- * Request http agent.
- */
- export const agent: http.Agent;
- /**
- * Request https agent.
- */
- export const httpsAgent: https.Agent;
- export class HttpClient<O extends RequestOptions = RequestOptions> extends EventEmitter {
- request<T = any>(url: string | url.URL): Promise<HttpClientResponse<T>>;
- request<T = any>(url: string | url.URL, options: O): Promise<HttpClientResponse<T>>;
- request<T = any>(url: string | url.URL, callback: Callback<T>): void;
- request<T = any>(url: string | url.URL, options: O, callback: Callback<T>): void;
- curl<T = any>(url: string | url.URL, options: O): Promise<HttpClientResponse<T>>;
- curl<T = any>(url: string | url.URL): Promise<HttpClientResponse<T>>;
- curl<T = any>(url: string | url.URL, callback: Callback<T>): void;
- curl<T = any>(url: string | url.URL, options: O, callback: Callback<T>): void;
- requestThunk(url: string | url.URL, options?: O): (callback: (...args: any[]) => void) => void;
- }
- export interface RequestOptions2 extends RequestOptions {
- retry?: number;
- retryDelay?: number;
- isRetry?: (res: HttpClientResponse<any>) => boolean;
- }
- /**
- * request method only return a promise,
- * compatible with async/await and generator in co.
- */
- export class HttpClient2 extends HttpClient<RequestOptions2> {}
- /**
- * Create a HttpClient instance.
- */
- export function create(options?: RequestOptions): HttpClient;
|