190 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			7.7 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.net.Socket;
							 | 
						||
| 
								 | 
							
								#if haxe4
							 | 
						||
| 
								 | 
							
								import js.lib.Error;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								import js.Error;
							 | 
						||
| 
								 | 
							
								#end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									An `Agent` is responsible for managing connection persistence and reuse for HTTP clients.
							 | 
						||
| 
								 | 
							
									It maintains a queue of pending requests for a given host and port, reusing a single socket connection for each until the queue is empty,
							 | 
						||
| 
								 | 
							
									at which time the socket is either destroyed or put into a pool where it is kept to be used again for requests to the same host and port.
							 | 
						||
| 
								 | 
							
									Whether it is destroyed or pooled depends on the `keepAlive` option.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Pooled connections have TCP Keep-Alive enabled for them, but servers may still close idle connections, in which case they will be removed
							 | 
						||
| 
								 | 
							
									from the pool and a new connection will be made when a new HTTP request is made for that host and port.
							 | 
						||
| 
								 | 
							
									Servers may also refuse to allow multiple requests over the same connection, in which case the connection will have to be remade for every
							 | 
						||
| 
								 | 
							
									request and cannot be pooled.
							 | 
						||
| 
								 | 
							
									The `Agent` will still make the requests to that server, but each one will occur over a new connection.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									When a connection is closed by the client or the server, it is removed from the pool.
							 | 
						||
| 
								 | 
							
									Any unused sockets in the pool will be unrefed so as not to keep the Node.js process running when there are no outstanding requests.
							 | 
						||
| 
								 | 
							
									(see [socket.unref()](https://nodejs.org/api/net.html#net_socket_unref)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									It is good practice, to `destroy()` an Agent instance when it is no longer in use, because unused sockets consume OS resources.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Sockets are removed from an agent when the socket emits either a `'close'` event or an `'agentRemove'` event.
							 | 
						||
| 
								 | 
							
									When intending to keep one HTTP request open for a long time without keeping it in the agent, something like the following may be done.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									An agent may also be used for an individual request. By providing `{agent: false}` as an option to the `http.get()` or `http.request()` functions,
							 | 
						||
| 
								 | 
							
									a one-time use `Agent` with default options will be used for the client connection.
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								@:jsRequire("http", "Agent")
							 | 
						||
| 
								 | 
							
								extern class Agent {
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										`options` in socket.connect() are also supported.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The default `http.globalAgent` that is used by `http.request()` has all of these values set to their respective defaults.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										To configure any of them, a custom `http.Agent` instance must be created.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									function new(?options:HttpAgentOptions);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Produces a socket/stream to be used for HTTP requests.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										By default, this function is the same as `net.createConnection()`.
							 | 
						||
| 
								 | 
							
										However, custom agents may override this method in case greater flexibility is desired.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										A socket/stream can be supplied in one of two ways: by returning the socket/stream from this function,
							 | 
						||
| 
								 | 
							
										or by passing the socket/stream to `callback`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										`callback` has a signature of `(err, stream)`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									#if haxe4
							 | 
						||
| 
								 | 
							
									function createConnection(options:SocketConnectOptionsTcp, ?callback:(err:Error, stream:Socket) -> Void):Socket;
							 | 
						||
| 
								 | 
							
									#else
							 | 
						||
| 
								 | 
							
									function createConnection(options:SocketConnectOptionsTcp, ?callback:Error->Socket->Void):Socket;
							 | 
						||
| 
								 | 
							
									#end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Called when `socket` is detached from a request and could be persisted by the `Agent`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This method can be overridden by a particular `Agent` subclass.
							 | 
						||
| 
								 | 
							
										If this method returns a falsy value, the socket will be destroyed instead of persisting it for use with the next request.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									function keepSocketAlive(socket:Socket):Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Called when `socket` is attached to `request` after being persisted because of the keep-alive options.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This method can be overridden by a particular `Agent` subclass.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									function reuseSocket(socket:Socket, request:ClientRequest):Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Destroy any sockets that are currently in use by the agent.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										It is usually not necessary to do this. However, if using an agent with `keepAlive` enabled,
							 | 
						||
| 
								 | 
							
										then it is best to explicitly shut down the agent when it will no longer be used. Otherwise,
							 | 
						||
| 
								 | 
							
										sockets may hang open for quite a long time before the server terminates them.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									function destroy():Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										An object which contains arrays of sockets currently awaiting use by the agent when keepAlive is enabled.
							 | 
						||
| 
								 | 
							
										Do not modify.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									var freeSockets(default, null):DynamicAccess<Array<Socket>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Get a unique name for a set of request options, to determine whether a connection can be reused.
							 | 
						||
| 
								 | 
							
										For an HTTP agent, this returns `host:port:localAddress` or `host:port:localAddress:family`.
							 | 
						||
| 
								 | 
							
										For an HTTPS agent, the name includes the CA, cert, ciphers, and other HTTPS/TLS-specific options that determine socket reusability.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									function getName(options:js.node.Http.HttpRequestOptions):String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										By default set to `256`.
							 | 
						||
| 
								 | 
							
										For agents with `keepAlive` enabled, this sets the maximum number of sockets that will be left open in the free state.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									var maxFreeSockets:Float;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										By default set to `Infinity`.
							 | 
						||
| 
								 | 
							
										Determines how many concurrent sockets the agent can have open per origin. Origin is the returned value of `getName()`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									var maxSockets:Float;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										An object which contains queues of requests that have not yet been assigned to sockets.
							 | 
						||
| 
								 | 
							
										Do not modify.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									var requests(default, null):DynamicAccess<Array<ClientRequest>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										An object which contains arrays of sockets currently in use by the agent.
							 | 
						||
| 
								 | 
							
										Do not modify.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									var sockets(default, null):DynamicAccess<Array<Socket>>;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									Options for `Agent` constructor.
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								typedef HttpAgentOptions = {
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Keep sockets around even when there are no outstanding requests, so they can be used for future requests
							 | 
						||
| 
								 | 
							
										without having to reestablish a TCP connection.
							 | 
						||
| 
								 | 
							
										Not to be confused with the `keep-alive` value of the `Connection` header.
							 | 
						||
| 
								 | 
							
										The `Connection: keep-alive` header is always sent when using an agent except when the `Connection` header
							 | 
						||
| 
								 | 
							
										is explicitly specified or when the `keepAlive` and `maxSockets` options are respectively set to `false` and `Infinity`,
							 | 
						||
| 
								 | 
							
										in which case `Connection: close` will be used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `false`
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var keepAlive:Bool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										When using the `keepAlive` option, specifies the [initial delay](https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay) for TCP Keep-Alive packets.
							 | 
						||
| 
								 | 
							
										Ignored when the `keepAlive` option is `false` or `undefined`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `1000`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var keepAliveMsecs:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Maximum number of sockets to allow per host. Each request will use a new socket until the maximum is reached.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `Infinity`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var maxSockets:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Maximum number of sockets to leave open in a free state. Only relevant if `keepAlive` is set to `true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Default: `256`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var maxFreeSockets:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Socket timeout in milliseconds. This will set the timeout when the socket is created.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:optional var timeout:Int;
							 | 
						||
| 
								 | 
							
								}
							 |