🚀. Socket Launch Week Day 2:Introducing Manifest Alerts.Learn more
Sign In

@smithy/protocol-http

Package Overview
Dependencies
Maintainers
3
Versions
76
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@smithy/protocol-http - npm Package Compare versions

Comparing version
5.3.14
to
5.4.0
+11
-169
dist-cjs/index.js

@@ -1,169 +0,11 @@

'use strict';
var types = require('@smithy/types');
const getHttpHandlerExtensionConfiguration = (runtimeConfig) => {
return {
setHttpHandler(handler) {
runtimeConfig.httpHandler = handler;
},
httpHandler() {
return runtimeConfig.httpHandler;
},
updateHttpClientConfig(key, value) {
runtimeConfig.httpHandler?.updateHttpClientConfig(key, value);
},
httpHandlerConfigs() {
return runtimeConfig.httpHandler.httpHandlerConfigs();
},
};
};
const resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {
return {
httpHandler: httpHandlerExtensionConfiguration.httpHandler(),
};
};
class Field {
name;
kind;
values;
constructor({ name, kind = types.FieldPosition.HEADER, values = [] }) {
this.name = name;
this.kind = kind;
this.values = values;
}
add(value) {
this.values.push(value);
}
set(values) {
this.values = values;
}
remove(value) {
this.values = this.values.filter((v) => v !== value);
}
toString() {
return this.values.map((v) => (v.includes(",") || v.includes(" ") ? `"${v}"` : v)).join(", ");
}
get() {
return this.values;
}
}
class Fields {
entries = {};
encoding;
constructor({ fields = [], encoding = "utf-8" }) {
fields.forEach(this.setField.bind(this));
this.encoding = encoding;
}
setField(field) {
this.entries[field.name.toLowerCase()] = field;
}
getField(name) {
return this.entries[name.toLowerCase()];
}
removeField(name) {
delete this.entries[name.toLowerCase()];
}
getByType(kind) {
return Object.values(this.entries).filter((field) => field.kind === kind);
}
}
class HttpRequest {
method;
protocol;
hostname;
port;
path;
query;
headers;
username;
password;
fragment;
body;
constructor(options) {
this.method = options.method || "GET";
this.hostname = options.hostname || "localhost";
this.port = options.port;
this.query = options.query || {};
this.headers = options.headers || {};
this.body = options.body;
this.protocol = options.protocol
? options.protocol.slice(-1) !== ":"
? `${options.protocol}:`
: options.protocol
: "https:";
this.path = options.path ? (options.path.charAt(0) !== "/" ? `/${options.path}` : options.path) : "/";
this.username = options.username;
this.password = options.password;
this.fragment = options.fragment;
}
static clone(request) {
const cloned = new HttpRequest({
...request,
headers: { ...request.headers },
});
if (cloned.query) {
cloned.query = cloneQuery(cloned.query);
}
return cloned;
}
static isInstance(request) {
if (!request) {
return false;
}
const req = request;
return ("method" in req &&
"protocol" in req &&
"hostname" in req &&
"path" in req &&
typeof req["query"] === "object" &&
typeof req["headers"] === "object");
}
clone() {
return HttpRequest.clone(this);
}
}
function cloneQuery(query) {
return Object.keys(query).reduce((carry, paramName) => {
const param = query[paramName];
return {
...carry,
[paramName]: Array.isArray(param) ? [...param] : param,
};
}, {});
}
class HttpResponse {
statusCode;
reason;
headers;
body;
constructor(options) {
this.statusCode = options.statusCode;
this.reason = options.reason;
this.headers = options.headers || {};
this.body = options.body;
}
static isInstance(response) {
if (!response)
return false;
const resp = response;
return typeof resp.statusCode === "number" && typeof resp.headers === "object";
}
}
function isValidHostname(hostname) {
const hostPattern = /^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/;
return hostPattern.test(hostname);
}
exports.Field = Field;
exports.Fields = Fields;
exports.HttpRequest = HttpRequest;
exports.HttpResponse = HttpResponse;
exports.getHttpHandlerExtensionConfiguration = getHttpHandlerExtensionConfiguration;
exports.isValidHostname = isValidHostname;
exports.resolveHttpHandlerRuntimeConfig = resolveHttpHandlerRuntimeConfig;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveHttpHandlerRuntimeConfig = exports.getHttpHandlerExtensionConfiguration = exports.isValidHostname = exports.HttpResponse = exports.HttpRequest = exports.Fields = exports.Field = void 0;
var protocols_1 = require("@smithy/core/protocols");
Object.defineProperty(exports, "Field", { enumerable: true, get: function () { return protocols_1.Field; } });
Object.defineProperty(exports, "Fields", { enumerable: true, get: function () { return protocols_1.Fields; } });
Object.defineProperty(exports, "HttpRequest", { enumerable: true, get: function () { return protocols_1.HttpRequest; } });
Object.defineProperty(exports, "HttpResponse", { enumerable: true, get: function () { return protocols_1.HttpResponse; } });
Object.defineProperty(exports, "isValidHostname", { enumerable: true, get: function () { return protocols_1.isValidHostname; } });
Object.defineProperty(exports, "getHttpHandlerExtensionConfiguration", { enumerable: true, get: function () { return protocols_1.getHttpHandlerExtensionConfiguration; } });
Object.defineProperty(exports, "resolveHttpHandlerRuntimeConfig", { enumerable: true, get: function () { return protocols_1.resolveHttpHandlerRuntimeConfig; } });

@@ -1,8 +0,1 @@

export * from "./extensions";
export * from "./Field";
export * from "./Fields";
export * from "./httpHandler";
export * from "./httpRequest";
export * from "./httpResponse";
export * from "./isValidHostname";
export * from "./types";
export { Field, Fields, HttpRequest, HttpResponse, isValidHostname, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, } from "@smithy/core/protocols";
+3
-8

@@ -1,8 +0,3 @@

export * from "./extensions";
export * from "./Field";
export * from "./Fields";
export * from "./httpHandler";
export * from "./httpRequest";
export * from "./httpResponse";
export * from "./isValidHostname";
export * from "./types";
/** @deprecated Use @smithy/core/protocols instead. */
export { Field, Fields, HttpRequest, HttpResponse, isValidHostname, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, } from "@smithy/core/protocols";
export type { FieldsOptions, HttpHandler, HttpHandlerUserInput, IHttpRequest, HttpHandlerExtensionConfiguration, HttpHandlerExtensionConfigType, FieldOptions, FieldPosition, HeaderBag, HttpMessage, HttpHandlerOptions, } from "@smithy/core/protocols";
{
"name": "@smithy/protocol-http",
"version": "5.3.14",
"version": "5.4.0",
"scripts": {
"build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'",
"build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline protocol-http",
"build:types": "yarn g:tsc -p tsconfig.types.json",
"build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4",
"clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo",
"format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"",
"lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"",
"stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz",
"test": "yarn g:vitest run",
"test:watch": "yarn g:vitest watch"
"build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json",
"clean": "rm -rf dist-cjs dist-es dist-types",
"stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz"
},

@@ -27,3 +20,3 @@ "main": "./dist-cjs/index.js",

"dependencies": {
"@smithy/types": "^4.14.1",
"@smithy/core": "^3.24.0",
"tslib": "^2.6.2"

@@ -34,9 +27,2 @@ },

},
"typesVersions": {
"<4.5": {
"dist-types/*": [
"dist-types/ts3.4/*"
]
}
},
"files": [

@@ -51,8 +37,2 @@ "dist-*/**"

},
"devDependencies": {
"concurrently": "7.0.0",
"downlevel-dts": "0.10.1",
"premove": "4.0.0",
"typedoc": "0.23.23"
},
"typedoc": {

@@ -59,0 +39,0 @@ "entryPoint": "src/index.ts"

export const getHttpHandlerExtensionConfiguration = (runtimeConfig) => {
return {
setHttpHandler(handler) {
runtimeConfig.httpHandler = handler;
},
httpHandler() {
return runtimeConfig.httpHandler;
},
updateHttpClientConfig(key, value) {
runtimeConfig.httpHandler?.updateHttpClientConfig(key, value);
},
httpHandlerConfigs() {
return runtimeConfig.httpHandler.httpHandlerConfigs();
},
};
};
export const resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {
return {
httpHandler: httpHandlerExtensionConfiguration.httpHandler(),
};
};
export * from "./httpExtensionConfiguration";
import { FieldPosition } from "@smithy/types";
export class Field {
name;
kind;
values;
constructor({ name, kind = FieldPosition.HEADER, values = [] }) {
this.name = name;
this.kind = kind;
this.values = values;
}
add(value) {
this.values.push(value);
}
set(values) {
this.values = values;
}
remove(value) {
this.values = this.values.filter((v) => v !== value);
}
toString() {
return this.values.map((v) => (v.includes(",") || v.includes(" ") ? `"${v}"` : v)).join(", ");
}
get() {
return this.values;
}
}
export class Fields {
entries = {};
encoding;
constructor({ fields = [], encoding = "utf-8" }) {
fields.forEach(this.setField.bind(this));
this.encoding = encoding;
}
setField(field) {
this.entries[field.name.toLowerCase()] = field;
}
getField(name) {
return this.entries[name.toLowerCase()];
}
removeField(name) {
delete this.entries[name.toLowerCase()];
}
getByType(kind) {
return Object.values(this.entries).filter((field) => field.kind === kind);
}
}
export class HttpRequest {
method;
protocol;
hostname;
port;
path;
query;
headers;
username;
password;
fragment;
body;
constructor(options) {
this.method = options.method || "GET";
this.hostname = options.hostname || "localhost";
this.port = options.port;
this.query = options.query || {};
this.headers = options.headers || {};
this.body = options.body;
this.protocol = options.protocol
? options.protocol.slice(-1) !== ":"
? `${options.protocol}:`
: options.protocol
: "https:";
this.path = options.path ? (options.path.charAt(0) !== "/" ? `/${options.path}` : options.path) : "/";
this.username = options.username;
this.password = options.password;
this.fragment = options.fragment;
}
static clone(request) {
const cloned = new HttpRequest({
...request,
headers: { ...request.headers },
});
if (cloned.query) {
cloned.query = cloneQuery(cloned.query);
}
return cloned;
}
static isInstance(request) {
if (!request) {
return false;
}
const req = request;
return ("method" in req &&
"protocol" in req &&
"hostname" in req &&
"path" in req &&
typeof req["query"] === "object" &&
typeof req["headers"] === "object");
}
clone() {
return HttpRequest.clone(this);
}
}
function cloneQuery(query) {
return Object.keys(query).reduce((carry, paramName) => {
const param = query[paramName];
return {
...carry,
[paramName]: Array.isArray(param) ? [...param] : param,
};
}, {});
}
export class HttpResponse {
statusCode;
reason;
headers;
body;
constructor(options) {
this.statusCode = options.statusCode;
this.reason = options.reason;
this.headers = options.headers || {};
this.body = options.body;
}
static isInstance(response) {
if (!response)
return false;
const resp = response;
return typeof resp.statusCode === "number" && typeof resp.headers === "object";
}
}
export function isValidHostname(hostname) {
const hostPattern = /^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/;
return hostPattern.test(hostname);
}
export {};
import type { HttpHandler } from "../httpHandler";
/**
* @internal
*/
export interface HttpHandlerExtensionConfiguration<HandlerConfig extends object = {}> {
setHttpHandler(handler: HttpHandler<HandlerConfig>): void;
httpHandler(): HttpHandler<HandlerConfig>;
updateHttpClientConfig(key: keyof HandlerConfig, value: HandlerConfig[typeof key]): void;
httpHandlerConfigs(): HandlerConfig;
}
/**
* @internal
*/
export type HttpHandlerExtensionConfigType<HandlerConfig extends object = {}> = Partial<{
httpHandler: HttpHandler<HandlerConfig>;
}>;
/**
* @internal
*
* Helper function to resolve default extension configuration from runtime config
*/
export declare const getHttpHandlerExtensionConfiguration: <HandlerConfig extends object = {}>(runtimeConfig: HttpHandlerExtensionConfigType<HandlerConfig>) => {
setHttpHandler(handler: HttpHandler<HandlerConfig>): void;
httpHandler(): HttpHandler<HandlerConfig>;
updateHttpClientConfig(key: keyof HandlerConfig, value: HandlerConfig[typeof key]): void;
httpHandlerConfigs(): HandlerConfig;
};
/**
* @internal
*
* Helper function to resolve runtime config from default extension configuration
*/
export declare const resolveHttpHandlerRuntimeConfig: <HandlerConfig extends object = {}>(httpHandlerExtensionConfiguration: HttpHandlerExtensionConfiguration<HandlerConfig>) => HttpHandlerExtensionConfigType<HandlerConfig>;
export * from "./httpExtensionConfiguration";
import type { FieldOptions } from "@smithy/types";
import { FieldPosition } from "@smithy/types";
/**
* A name-value pair representing a single field
* transmitted in an HTTP Request or Response.
*
* The kind will dictate metadata placement within
* an HTTP message.
*
* All field names are case insensitive and
* case-variance must be treated as equivalent.
* Names MAY be normalized but SHOULD be preserved
* for accuracy during transmission.
*/
export declare class Field {
readonly name: string;
readonly kind: FieldPosition;
values: string[];
constructor({ name, kind, values }: FieldOptions);
/**
* Appends a value to the field.
*
* @param value The value to append.
*/
add(value: string): void;
/**
* Overwrite existing field values.
*
* @param values The new field values.
*/
set(values: string[]): void;
/**
* Remove all matching entries from list.
*
* @param value Value to remove.
*/
remove(value: string): void;
/**
* Get comma-delimited string.
*
* @returns String representation of {@link Field}.
*/
toString(): string;
/**
* Get string values as a list
*
* @returns Values in {@link Field} as a list.
*/
get(): string[];
}
import type { FieldPosition } from "@smithy/types";
import type { Field } from "./Field";
export type FieldsOptions = {
fields?: Field[];
encoding?: string;
};
/**
* Collection of Field entries mapped by name.
*/
export declare class Fields {
private readonly entries;
private readonly encoding;
constructor({ fields, encoding }: FieldsOptions);
/**
* Set entry for a {@link Field} name. The `name`
* attribute will be used to key the collection.
*
* @param field The {@link Field} to set.
*/
setField(field: Field): void;
/**
* Retrieve {@link Field} entry by name.
*
* @param name The name of the {@link Field} entry
* to retrieve
* @returns The {@link Field} if it exists.
*/
getField(name: string): Field | undefined;
/**
* Delete entry from collection.
*
* @param name Name of the entry to delete.
*/
removeField(name: string): void;
/**
* Helper function for retrieving specific types of fields.
* Used to grab all headers or all trailers.
*
* @param kind {@link FieldPosition} of entries to retrieve.
* @returns The {@link Field} entries with the specified
* {@link FieldPosition}.
*/
getByType(kind: FieldPosition): Field[];
}
import type { FetchHttpHandlerOptions, HttpHandlerOptions, NodeHttpHandlerOptions, RequestHandler } from "@smithy/types";
import type { HttpRequest } from "./httpRequest";
import type { HttpResponse } from "./httpResponse";
/**
* @internal
*/
export type HttpHandler<HttpHandlerConfig extends object = {}> = RequestHandler<HttpRequest, HttpResponse, HttpHandlerOptions> & {
/**
* @internal
*/
updateHttpClientConfig(key: keyof HttpHandlerConfig, value: HttpHandlerConfig[typeof key]): void;
/**
* @internal
*/
httpHandlerConfigs(): HttpHandlerConfig;
};
/**
* @public
*
* A type representing the accepted user inputs for the `requestHandler` field
* of a client's constructor object.
*
* You may provide an instance of an HttpHandler, or alternatively
* provide the constructor arguments as an object which will be passed
* to the constructor of the default request handler.
*
* The default class constructor to which your arguments will be passed
* varies. The Node.js default is the NodeHttpHandler and the browser/react-native
* default is the FetchHttpHandler. In rarer cases specific clients may be
* configured to use other default implementations such as Websocket or HTTP2.
*
* The fallback type Record<string, unknown> is part of the union to allow
* passing constructor params to an unknown requestHandler type.
*/
export type HttpHandlerUserInput = HttpHandler | NodeHttpHandlerOptions | FetchHttpHandlerOptions | Record<string, unknown>;
import type { HeaderBag, HttpMessage, QueryParameterBag, URI } from "@smithy/types";
import { HttpRequest as IHttpRequest } from "@smithy/types";
type HttpRequestOptions = Partial<HttpMessage> & Partial<URI> & {
method?: string;
};
/**
* Use the distinct IHttpRequest interface from \@smithy/types instead.
* This should not be used due to
* overlapping with the concrete class' name.
*
* This is not marked deprecated since that would mark the concrete class
* deprecated as well.
*
* @internal
*/
export interface HttpRequest extends IHttpRequest {
}
/**
* @public
*/
export { IHttpRequest };
/**
* @public
*/
export declare class HttpRequest implements HttpMessage, URI {
method: string;
protocol: string;
hostname: string;
port?: number;
path: string;
query: QueryParameterBag;
headers: HeaderBag;
username?: string;
password?: string;
fragment?: string;
body?: any;
constructor(options: HttpRequestOptions);
/**
* Note: this does not deep-clone the body.
*/
static clone(request: IHttpRequest): HttpRequest;
/**
* This method only actually asserts that request is the interface {@link IHttpRequest},
* and not necessarily this concrete class. Left in place for API stability.
*
* Do not call instance methods on the input of this function, and
* do not assume it has the HttpRequest prototype.
*/
static isInstance(request: unknown): request is HttpRequest;
/**
* @deprecated use static HttpRequest.clone(request) instead. It's not safe to call
* this method because {@link HttpRequest.isInstance} incorrectly
* asserts that IHttpRequest (interface) objects are of type HttpRequest (class).
*/
clone(): HttpRequest;
}
import type { HeaderBag, HttpMessage, HttpResponse as IHttpResponse } from "@smithy/types";
type HttpResponseOptions = Partial<HttpMessage> & {
statusCode: number;
reason?: string;
};
/**
* Use the distinct IHttpResponse interface from \@smithy/types instead.
* This should not be used due to
* overlapping with the concrete class' name.
*
* This is not marked deprecated since that would mark the concrete class
* deprecated as well.
*
* @internal
*/
export interface HttpResponse extends IHttpResponse {
}
/**
* @public
*/
export declare class HttpResponse {
statusCode: number;
reason?: string;
headers: HeaderBag;
body?: any;
constructor(options: HttpResponseOptions);
static isInstance(response: unknown): response is HttpResponse;
}
export {};
export declare function isValidHostname(hostname: string): boolean;
import type { FieldOptions as __FieldOptions, FieldPosition as __FieldPosition, HeaderBag as __HeaderBag, HttpHandlerOptions as __HttpHandlerOptions, HttpMessage as __HttpMessage } from "@smithy/types";
/**
* @deprecated Use FieldOptions from `@smithy/types` instead
*/
export type FieldOptions = __FieldOptions;
/**
* @deprecated Use FieldPosition from `@smithy/types` instead
*/
export type FieldPosition = __FieldPosition;
/**
* @deprecated Use HeaderBag from `@smithy/types` instead
*/
export type HeaderBag = __HeaderBag;
/**
* @deprecated Use HttpMessage from `@smithy/types` instead
*/
export type HttpMessage = __HttpMessage;
/**
* @deprecated Use HttpHandlerOptions from `@smithy/types` instead
*/
export type HttpHandlerOptions = __HttpHandlerOptions;
# @smithy/protocol-http
[![NPM version](https://img.shields.io/npm/v/@smithy/protocol-http/latest.svg)](https://www.npmjs.com/package/@smithy/protocol-http)
[![NPM downloads](https://img.shields.io/npm/dm/@smithy/protocol-http.svg)](https://www.npmjs.com/package/@smithy/protocol-http)
### :warning: Internal API :warning:
> This is an internal package.
> That means this is used as a dependency for other, public packages, but
> should not be taken directly as a dependency in your application's `package.json`.
> If you are updating the version of this package, for example to bring in a
> bug-fix, you should do so by updating your application lockfile with
> e.g. `npm up @scope/package` or equivalent command in another
> package manager, rather than taking a direct dependency.
---