2025-01-22 16:18:30 +01:00

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;
}