246 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			246 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (C)2014-2020 Haxe Foundation
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Permission is hereby granted, free of charge, to any person obtaining a
							 | 
						||
| 
								 | 
							
								 * copy of this software and associated documentation files (the "Software"),
							 | 
						||
| 
								 | 
							
								 * to deal in the Software without restriction, including without limitation
							 | 
						||
| 
								 | 
							
								 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
							 | 
						||
| 
								 | 
							
								 * and/or sell copies of the Software, and to permit persons to whom the
							 | 
						||
| 
								 | 
							
								 * Software is furnished to do so, subject to the following conditions:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The above copyright notice and this permission notice shall be included in
							 | 
						||
| 
								 | 
							
								 * all copies or substantial portions of the Software.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						||
| 
								 | 
							
								 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						||
| 
								 | 
							
								 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
							 | 
						||
| 
								 | 
							
								 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
							 | 
						||
| 
								 | 
							
								 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
							 | 
						||
| 
								 | 
							
								 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
							 | 
						||
| 
								 | 
							
								 * DEALINGS IN THE SOFTWARE.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package js.node;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import haxe.DynamicAccess;
							 | 
						||
| 
								 | 
							
								import haxe.extern.EitherType;
							 | 
						||
| 
								 | 
							
								import js.node.http.*;
							 | 
						||
| 
								 | 
							
								import js.node.net.Socket;
							 | 
						||
| 
								 | 
							
								import js.node.stream.Duplex;
							 | 
						||
| 
								 | 
							
								import js.node.url.URL;
							 | 
						||
| 
								 | 
							
								#if haxe4
							 | 
						||
| 
								 | 
							
								import js.lib.Error;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								import js.Error;
							 | 
						||
| 
								 | 
							
								#end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									The HTTP interfaces in Node are designed to support many features of the protocol
							 | 
						||
| 
								 | 
							
									which have been traditionally difficult to use. In particular, large, possibly chunk-encoded, messages.
							 | 
						||
| 
								 | 
							
									The interface is careful to never buffer entire requests or responses--the user is able to stream data.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									HTTP message headers are represented by an object like this:
							 | 
						||
| 
								 | 
							
										{ 'content-length': '123',
							 | 
						||
| 
								 | 
							
										  'content-type': 'text/plain',
							 | 
						||
| 
								 | 
							
										  'connection': 'keep-alive' }
							 | 
						||
| 
								 | 
							
									Keys are lowercased. Values are not modified.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									In order to support the full spectrum of possible HTTP applications, Node's HTTP API is very low-level.
							 | 
						||
| 
								 | 
							
									It deals with stream handling and message parsing only. It parses a message into headers and body but
							 | 
						||
| 
								 | 
							
									it does not parse the actual headers or the body.
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								@:jsRequire("http")
							 | 
						||
| 
								 | 
							
								extern class Http {
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										A list of the HTTP methods that are supported by the parser.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									static var METHODS:Array<String>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										A collection of all the standard HTTP response status codes, and the short description of each.
							 | 
						||
| 
								 | 
							
										For example, `http.STATUS_CODES[404] === 'Not Found'`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									static var STATUS_CODES(default, null):DynamicAccess<String>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns a new web server object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The `requestListener` is a function which is automatically added to the `'request'` event.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									#if haxe4
							 | 
						||
| 
								 | 
							
									@:overload(function(options:HttpCreateServerOptions, ?requestListener:(request:IncomingMessage, response:ServerResponse) -> Void):Server {})
							 | 
						||
| 
								 | 
							
									static function createServer(?requestListener:(request:IncomingMessage, response:ServerResponse) -> Void):Server;
							 | 
						||
| 
								 | 
							
									#else
							 | 
						||
| 
								 | 
							
									@:overload(function(options:HttpCreateServerOptions, ?requestListener:IncomingMessage->ServerResponse->Void):Server {})
							 | 
						||
| 
								 | 
							
									static function createServer(?requestListener:IncomingMessage->ServerResponse->Void):Server;
							 | 
						||
| 
								 | 
							
									#end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Since most requests are GET requests without bodies, Node.js provides this convenience method.
							 | 
						||
| 
								 | 
							
										The only difference between this method and `request()` is that it sets the method to GET and calls `end()` automatically.
							 | 
						||
| 
								 | 
							
										The callback must take care to consume the response data for reasons stated in `http.ClientRequest` section.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:overload(function(url:URL, ?options:HttpRequestOptions, ?callback:IncomingMessage->Void):ClientRequest {})
							 | 
						||
| 
								 | 
							
									@:overload(function(url:String, ?options:HttpRequestOptions, ?callback:IncomingMessage->Void):ClientRequest {})
							 | 
						||
| 
								 | 
							
									static function get(options:HttpRequestOptions, ?callback:IncomingMessage->Void):ClientRequest;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Global instance of Agent which is used as the default for all http client requests.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									static var globalAgent:Agent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static var maxHeaderSize:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Node.js maintains several connections per server to make HTTP requests.
							 | 
						||
| 
								 | 
							
										This function allows one to transparently issue requests.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										`url` can be a string or a URL object.
							 | 
						||
| 
								 | 
							
										If `url` is a string, it is automatically parsed with `new URL()`.
							 | 
						||
| 
								 | 
							
										If it is a `URL` object, it will be automatically converted to an ordinary `options` object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If both `url` and `options` are specified, the objects are merged, with the `options` properties taking precedence.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The optional `callback` parameter will be added as a one-time listener for the `'response'` event.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										`request()` returns an instance of the `http.ClientRequest` class.
							 | 
						||
| 
								 | 
							
										The `ClientRequest` instance is a writable stream.
							 | 
						||
| 
								 | 
							
										If one needs to upload a file with a POST request, then write to the `ClientRequest` object.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:overload(function(url:URL, ?options:HttpRequestOptions, ?callback:IncomingMessage->Void):ClientRequest {})
							 | 
						||
| 
								 | 
							
									@:overload(function(url:String, ?options:HttpRequestOptions, ?callback:IncomingMessage->Void):ClientRequest {})
							 | 
						||
| 
								 | 
							
									static function request(options:HttpRequestOptions, ?callback:IncomingMessage->Void):ClientRequest;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef HttpCreateServerOptions = {
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Specifies the `IncomingMessage` class to be used. Useful for extending the original `IncomingMessage`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `js.node.http.IncomingMessage`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var IncomingMessage:Class<Dynamic>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Specifies the `ServerResponse` class to be used. Useful for extending the original `ServerResponse`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `ServerResponse`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var ServerResponse:Class<Dynamic>;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									Type of the options object passed to `Http.request`.
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								typedef HttpRequestOptions = {
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Controls Agent behavior.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Possible values:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										- `undefined` (default): use http.globalAgent for this host and port.
							 | 
						||
| 
								 | 
							
										- `Agent` object: explicitly use the passed in `Agent`.
							 | 
						||
| 
								 | 
							
										- `false` : causes a new `Agent` with default values to be used.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var agent:EitherType<Agent, Bool>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Basic authentication i.e. `'user:password'` to compute an Authorization header.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var auth:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										A function that produces a socket/stream to use for the request when the `agent` option is not used.
							 | 
						||
| 
								 | 
							
										This can be used to avoid creating a custom `Agent` class just to override the default `createConnection` function.
							 | 
						||
| 
								 | 
							
										See [agent.createConnection()](https://nodejs.org/api/http.html#http_agent_createconnection_options_callback) for more details.
							 | 
						||
| 
								 | 
							
										Any `Duplex` stream is a valid return value.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									#if haxe4
							 | 
						||
| 
								 | 
							
									@:optional var createConnection:(options:SocketConnectOptionsTcp, ?callabck:(err:Error, stream:IDuplex) -> Void) -> IDuplex;
							 | 
						||
| 
								 | 
							
									#else
							 | 
						||
| 
								 | 
							
									@:optional var createConnection:SocketConnectOptionsTcp->?(Error->IDuplex->Void)->IDuplex;
							 | 
						||
| 
								 | 
							
									#end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Default port for the protocol.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `agent.defaultPort` if an Agent is used, else `undefined`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var defaultPort:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										IP address family to use when resolving `host` or `hostname`.
							 | 
						||
| 
								 | 
							
										Valid values are `4` or `6`. When unspecified, both IP v4 and v6 will be used.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var family:js.node.Dns.DnsAddressFamily;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										An object containing request headers.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var headers:DynamicAccess<EitherType<String, Array<String>>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										A domain name or IP address of the server to issue the request to.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `'localhost'`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var host:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Alias for `host`.
							 | 
						||
| 
								 | 
							
										To support `url.parse()`, hostname will be used if both `host` and `hostname` are specified.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var hostname:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Local interface to bind for network connections.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var localAddress:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										A string specifying the HTTP request method.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `'GET'`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var method:Method;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Request path. Should include query string if any. E.G. `'/index.html?page=12'`.
							 | 
						||
| 
								 | 
							
										An exception is thrown when the request path contains illegal characters.
							 | 
						||
| 
								 | 
							
										Currently, only spaces are rejected but that may change in the future.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `'/'`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var path:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Port of remote server.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `defaultPort` if set, else `80`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var port:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Protocol to use.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `'http:'`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var protocol:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Specifies whether or not to automatically add the Host header.
							 | 
						||
| 
								 | 
							
										Defaults to `true`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var setHost:Bool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Unix Domain Socket (cannot be used if one of host or port is specified, those specify a TCP Socket).
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var socketPath:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										A number specifying the socket timeout in milliseconds.
							 | 
						||
| 
								 | 
							
										This will set the timeout before the socket is connected.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var timeout:Int;
							 | 
						||
| 
								 | 
							
								}
							 |