You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					281 lines
				
				11 KiB
			
		
		
			
		
	
	
					281 lines
				
				11 KiB
			| 
											3 years ago
										 | 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" | ||
|  |   | "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; |