@foxify/http
Version:
Foxify HTTP module
196 lines • 7.12 kB
TypeScript
/// <reference types="node" />
/// <reference types="node" />
import { IncomingHttpHeaders, IncomingMessage } from "http";
import { UrlWithStringQuery } from "url";
import { MethodT, ProtocolT } from "./constants";
import { Accepts, RANGE_PARSER_RESULT, RangeParserRangesI } from "./utils";
export declare const DEFAULT_SETTINGS: SettingsI;
export default class Request extends IncomingMessage {
readonly headers: HeadersI;
readonly method: MethodT;
readonly params: Record<string, unknown>;
readonly statusCode: undefined;
readonly statusMessage: undefined;
readonly url: string;
protected _acceptsCache?: Accepts;
protected _parsedUrl?: UrlWithStringQuery;
protected _queryCache?: Record<string, unknown>;
/**
* Parse the "Host" header field to a hostname.
*
* When the "trust.proxy" setting trusts the socket
* address, the "X-Forwarded-Host" header field will
* be trusted.
*/
get hostname(): string | undefined;
/**
* Return the remote address from the trusted proxy.
*
* This is the remote address on the socket unless
* "trust.proxy" is set.
*/
get ip(): string;
/**
* When "trust.proxy" is set, trusted proxy addresses + client.
*
* For example if the value were "client, proxy1, proxy2"
* you would receive the array `["client", "proxy1", "proxy2"]`
* where "proxy2" is the furthest down-stream and "proxy1" and
* "proxy2" were trusted.
*/
get ips(): string[];
/**
* Short-hand for `url.parseUrl(req.url).pathname`.
*/
get path(): string;
/**
* Return the protocol string "http" or "https"
* when requested with TLS. When the "trust.proxy"
* setting trusts the socket address, the
* "X-Forwarded-Proto" header field will be trusted
* and used if present.
*
* If you're running behind a reverse proxy that
* supplies https for you this may be enabled.
*/
get protocol(): ProtocolT;
get query(): Record<string, unknown>;
/**
* Short-hand for:
*
* req.protocol === 'https'
*/
get secure(): boolean;
/**
* Return subdomains as an array.
*
* Subdomains are the dot-separated parts of the host before the main domain of
* the app. By default, the domain of the app is assumed to be the last two
* parts of the host. This can be changed by setting "subdomain offset".
*
* For example, if the domain is "tobi.ferrets.example.com":
* If "subdomain.offset" is not set, req.subdomains is `["ferrets", "tobi"]`.
* If "subdomain.offset" is 3, req.subdomains is `["tobi"]`.
*/
get subdomains(): string[];
/**
* Check if the request was an `_XMLHttpRequest_`.
*/
get xhr(): boolean;
protected get _accepts(): Accepts;
/**
* Check if the given `type(s)` is acceptable, returning
* the best match when true, otherwise `undefined`, in which
* case you should respond with 406 "Not Acceptable".
*
* The `type` value may be a single MIME type string
* such as "application/json", an extension name
* such as "json", a comma-delimited list such as "json, html, text/plain",
* an argument list such as `"json", "html", "text/plain"`,
* When a list is given, the _best_ match, if any is returned.
*
* @example
* // Accept: text/html
* req.accepts("html");
* // => "html"
* @example
* // Accept: text/*, application/json
* req.accepts("html");
* // => "html"
* req.accepts("text/html");
* // => "text/html"
* req.accepts("json, text");
* // => "json"
* req.accepts("application/json");
* // => "application/json"
* @example
* // Accept: text/*, application/json
* req.accepts("image/png");
* req.accepts("png");
* // => undefined
* @example
* // Accept: text/*;q=.5, application/json
* req.accepts("html", "json");
* req.accepts("html, json");
* // => "json"
*/
accepts(...types: string[]): string[] | string | false;
/**
* Check if the given `charset`s are acceptable,
* otherwise you should respond with 406 "Not Acceptable".
*/
acceptsCharsets(...charsets: string[]): string[] | string | false;
/**
* Check if the given `encoding`s are accepted.
*/
acceptsEncodings(...encodings: string[]): string[] | string | false;
/**
* Check if the given `language`s are acceptable,
* otherwise you should respond with 406 "Not Acceptable".
*/
acceptsLanguages(...languages: string[]): string[] | string | false;
/**
* Return request header.
*
* The `Referrer` header field is special-cased,
* both `Referrer` and `Referer` are interchangeable.
*
* @example
* req.get("Content-Type"); // => "text/plain"
* @example
* req.get("content-type"); // => "text/plain"
* @example
* req.get("Something"); // => undefined
*/
get<Header extends Extract<keyof HeadersI, string>>(name: Header | Uppercase<Header>): HeadersI[Header];
/**
* Check if the incoming request contains the "Content-Type"
* header field, and it contains the give mime `type`.
*
* @example
* // With Content-Type: text/html; charset=utf-8
* req.is("html");
* req.is("text/html");
* req.is("text/*");
* // => true
* @example
* // When Content-Type is application/json
* req.is("json");
* req.is("application/json");
* req.is("application/*");
* // => true
* @example
* req.is("html");
* // => false
*/
is(...types: string[]): string | false | null;
/**
* Parse Range header field, capping to the given `size`.
*
* Unspecified ranges such as "0-" require knowledge of your resource length. In
* the case of a byte range this is of course the total number of bytes. If the
* Range header field is not given `undefined` is returned, `-1` when unsatisfiable,
* and `-2` when syntactically invalid.
*
* When ranges are returned, the array has a "type" property which is the type of
* range that is required (most commonly, "bytes"). Each array element is an object
* with a "start" and "end" property for the portion of the range.
*
* NOTE: remember that ranges are inclusive, so for example "Range: users=0-3"
* should respond with 4 users when available, not 3.
*/
range(size: number, combine?: boolean): RANGE_PARSER_RESULT | RangeParserRangesI | undefined;
}
export declare function settings(settings?: Partial<SettingsI>): void;
export interface HeadersI extends IncomingHttpHeaders {
referrer: IncomingHttpHeaders["referer"];
"x-forwarded-host"?: string;
"x-forwarded-proto"?: string;
"x-requested-with"?: string;
}
export interface SettingsI {
"subdomain.offset": number;
"query.parser"(str: string): Record<string, unknown>;
"trust.proxy"(ip: string, hopIndex: number): boolean;
}
//# sourceMappingURL=Request.d.ts.map