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