224 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			224 lines
		
	
	
		
			8.6 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.http; | ||
|  | 
 | ||
|  | import haxe.DynamicAccess; | ||
|  | import js.node.Buffer; | ||
|  | import js.node.events.EventEmitter.Event; | ||
|  | import js.node.net.Socket; | ||
|  | import js.node.stream.Writable; | ||
|  | 
 | ||
|  | /** | ||
|  | 	Enumeration of events emitted by `ClientRequest` | ||
|  | **/ | ||
|  | @:enum abstract ClientRequestEvent<T:haxe.Constraints.Function>(Event<T>) to Event<T> { | ||
|  | 	/** | ||
|  | 		Emitted when the request has been aborted by the client. | ||
|  | 		This event is only emitted on the first call to `abort()`. | ||
|  | 	**/ | ||
|  | 	var Abort:ClientRequestEvent<Void->Void> = "abort"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted each time a server responds to a request with a `CONNECT` method. | ||
|  | 		If this event is not being listened for, clients receiving a `CONNECT` method will have their connections closed. | ||
|  | 	**/ | ||
|  | 	#if haxe4 | ||
|  | 	var Connect:ClientRequestEvent<(response:IncomingMessage, socket:Socket, head:Buffer) -> Void> = "connect"; | ||
|  | 	#else | ||
|  | 	var Connect:ClientRequestEvent<IncomingMessage->Socket->Buffer->Void> = "connect"; | ||
|  | 	#end | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when the server sends a '100 Continue' HTTP response, | ||
|  | 		usually because the request contained 'Expect: 100-continue'. | ||
|  | 		This is an instruction that the client should send the request body. | ||
|  | 	**/ | ||
|  | 	var Continue:ClientRequestEvent<Void->Void> = "continue"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when the server sends a 1xx intermediate response (excluding 101 Upgrade). | ||
|  | 		The listeners of this event will receive an object containing the HTTP version, status code, status message, | ||
|  | 		key-value headers object, and array with the raw header names followed by their respective values. | ||
|  | 	**/ | ||
|  | 	var Information:ClientRequestEvent<InformationEventData->Void> = "information"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when a response is received to this request. This event is emitted only once. | ||
|  | 	**/ | ||
|  | 	var Response:ClientRequestEvent<IncomingMessage->Void> = "response"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted after a socket is assigned to this request. | ||
|  | 	**/ | ||
|  | 	var Socket:ClientRequestEvent<Socket->Void> = "socket"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when the underlying socket times out from inactivity. | ||
|  | 		This only notifies that the socket has been idle. The request must be aborted manually. | ||
|  | 
 | ||
|  | 		See also: [request.setTimeout()](https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback). | ||
|  | 	**/ | ||
|  | 	var Timeout:ClientRequestEvent<Socket->Void> = "timeout"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted each time a server responds to a request with an upgrade. | ||
|  | 		If this event is not being listened for and the response status code is 101 Switching Protocols, | ||
|  | 		clients receiving an upgrade header will have their connections closed. | ||
|  | 	**/ | ||
|  | 	#if haxe4 | ||
|  | 	var Upgrade:ClientRequestEvent<(response:IncomingMessage, socket:Socket, head:Buffer) -> Void> = "upgrade"; | ||
|  | 	#else | ||
|  | 	var Upgrade:ClientRequestEvent<IncomingMessage->Socket->Buffer->Void> = "upgrade"; | ||
|  | 	#end | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	This object is created internally and returned from http.request(). | ||
|  | 	It represents an in-progress request whose header has already been queued. | ||
|  | 	The header is still mutable using the `setHeader(name, value)`, `getHeader(name)`, `removeHeader(name)` API. | ||
|  | 	The actual header will be sent along with the first data chunk or when calling `request.end()`. | ||
|  | 
 | ||
|  | 	To get the response, add a listener for `'response'` to the request object. | ||
|  | 	`'response'` will be emitted from the request object when the response headers have been received. | ||
|  | 	The `'response'` event is executed with one argument which is an instance of `http.IncomingMessage`. | ||
|  | 
 | ||
|  | 	During the `'response'` event, one can add listeners to the response object; particularly to listen for the `'data'` event. | ||
|  | 
 | ||
|  | 	If no `'response'` handler is added, then the response will be entirely discarded. However, | ||
|  | 	if a `'response'` event handler is added, then the data from the response object *must* be consumed, | ||
|  | 	either by calling `response.read()` whenever there is a `'readable'` event, or by adding a `'data'` handler, | ||
|  | 	or by calling the `.resume()` method. Until the data is consumed, the `'end'` event will not fire. | ||
|  | 	Also, until the data is read it will consume memory that can eventually lead to a 'process out of memory' error. | ||
|  | 
 | ||
|  | 	Unlike the `request` object, if the response closes prematurely, the response object does not emit an `'error'` event | ||
|  | 	but instead emits the `'aborted'` event. | ||
|  | 
 | ||
|  | 	Node.js does not check whether Content-Length and the length of the body which has been transmitted are equal or not. | ||
|  | **/ | ||
|  | @:jsRequire("http", "ClientRequest") | ||
|  | extern class ClientRequest extends Writable<ClientRequest> { | ||
|  | 	/** | ||
|  | 		Marks the request as aborting. Calling this will cause remaining data in the response to be dropped and the socket to be destroyed. | ||
|  | 	**/ | ||
|  | 	function abort():Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The request.aborted property will be true if the request has been aborted. | ||
|  | 	**/ | ||
|  | 	var aborted(default, null):Bool; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		See `request.socket`. | ||
|  | 	**/ | ||
|  | 	var connection(default, null):Socket; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The `response.finished` property will be true if `response.end()` has been called. | ||
|  | 	**/ | ||
|  | 	var finished(default, null):Bool; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Flush the request headers. | ||
|  | 
 | ||
|  | 		For efficiency reasons, node.js normally buffers the request headers until you call `request.end()` | ||
|  | 		or write the first chunk of request data. It then tries hard to pack the request headers and data | ||
|  | 		into a single TCP packet. | ||
|  | 
 | ||
|  | 		That's usually what you want (it saves a TCP round-trip) but not when the first data isn't sent | ||
|  | 		until possibly much later. `flushHeaders` lets you bypass the optimization and kickstart the request. | ||
|  | 	**/ | ||
|  | 	function flushHeaders():Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Reads out a header on the request. The name is case-insensitive. | ||
|  | 		The type of the return value depends on the arguments provided to `request.setHeader()`. | ||
|  | 	**/ | ||
|  | 	function getHeader(name:String):haxe.extern.EitherType<String, Array<String>>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Limits maximum response headers count. If set to 0, no limit will be applied. | ||
|  | 
 | ||
|  | 		Default: `2000` | ||
|  | 	**/ | ||
|  | 	var maxHeadersCount:Null<Int>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The request path. | ||
|  | 	**/ | ||
|  | 	var path(default, null):String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Removes a header that's already defined into headers object.
 | ||
|  | 	**/ | ||
|  | 	function removeHeader(name:String):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Sets a single header value for headers object. | ||
|  | 		If this header already exists in the to-be-sent headers, its value will be replaced. | ||
|  | 		Use an array of strings here to send multiple headers with the same name. | ||
|  | 		Non-string values will be stored without modification. Therefore, `request.getHeader()` may return non-string values. | ||
|  | 		However, the non-string values will be converted to strings for network transmission. | ||
|  | 	**/ | ||
|  | 	@:overload(function(name:String, value:Array<String>):Void {}) | ||
|  | 	function setHeader(name:String, value:String):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Once a socket is assigned to this request and is connected | ||
|  | 		`socket.setNoDelay` will be called. | ||
|  | 	**/ | ||
|  | 	function setNoDelay(?noDelay:Bool):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Once a socket is assigned to this request and is connected | ||
|  | 		`socket.setKeepAlive`() will be called. | ||
|  | 	**/ | ||
|  | 	@:overload(function(?initialDelay:Int):Void {}) | ||
|  | 	function setSocketKeepAlive(enable:Bool, ?initialDelay:Int):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Once a socket is assigned to this request and is connected `socket.setTimeout()` will be called. | ||
|  | 	**/ | ||
|  | 	function setTimeout(timeout:Int, ?callback:Socket->Void):ClientRequest; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Reference to the underlying socket. Usually users will not want to access this property. | ||
|  | 		In particular, the socket will not emit `'readable'` events because of how the protocol parser attaches to the socket. | ||
|  | 		The `socket` may also be accessed via `request.connection`. | ||
|  | 	 */ | ||
|  | 	var socket(default, null):Socket; | ||
|  | 
 | ||
|  | 	// This field is defined in super class. | ||
|  | 	// var writableEnded(default, null):Bool; | ||
|  | 	// var writableFinished(default, null):Bool; | ||
|  | } | ||
|  | 
 | ||
|  | typedef InformationEventData = { | ||
|  | 	var httpVersion:String; | ||
|  | 	var httpVersionMajor:Int; | ||
|  | 	var httpVersionMinor:Int; | ||
|  | 	var statusCode:Int; | ||
|  | 	var statusMessage:String; | ||
|  | 	var headers:DynamicAccess<String>; | ||
|  | 	var rawHeaders:Array<String>; | ||
|  | } |