@aws-sdk/node-http-handler
Advanced tools
Comparing version 3.329.0 to 3.337.0
@@ -11,5 +11,5 @@ "use strict"; | ||
const set_connection_timeout_1 = require("./set-connection-timeout"); | ||
const set_socket_keep_alive_1 = require("./set-socket-keep-alive"); | ||
const set_socket_timeout_1 = require("./set-socket-timeout"); | ||
const write_request_body_1 = require("./write-request-body"); | ||
const set_socket_keep_alive_1 = require("./set-socket-keep-alive"); | ||
exports.DEFAULT_REQUEST_TIMEOUT = 0; | ||
@@ -52,3 +52,12 @@ class NodeHttpHandler { | ||
} | ||
return new Promise((resolve, reject) => { | ||
return new Promise((_resolve, _reject) => { | ||
let writeRequestBodyPromise = undefined; | ||
const resolve = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_resolve(arg); | ||
}; | ||
const reject = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_reject(arg); | ||
}; | ||
if (!this.config) { | ||
@@ -107,3 +116,3 @@ throw new Error("Node HTTP request handler config is not resolved"); | ||
} | ||
(0, write_request_body_1.writeRequestBody)(req, request); | ||
writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, this.config.requestTimeout); | ||
}); | ||
@@ -110,0 +119,0 @@ } |
@@ -39,5 +39,14 @@ "use strict"; | ||
const { requestTimeout, disableConcurrentStreams } = this.config; | ||
return new Promise((resolve, rejectOriginal) => { | ||
return new Promise((_resolve, _reject) => { | ||
var _a; | ||
let fulfilled = false; | ||
let writeRequestBodyPromise = undefined; | ||
const resolve = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_resolve(arg); | ||
}; | ||
const reject = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_reject(arg); | ||
}; | ||
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) { | ||
@@ -47,3 +56,3 @@ fulfilled = true; | ||
abortError.name = "AbortError"; | ||
rejectOriginal(abortError); | ||
reject(abortError); | ||
return; | ||
@@ -58,3 +67,3 @@ } | ||
}); | ||
const reject = (err) => { | ||
const rejectWithDestroy = (err) => { | ||
if (disableConcurrentStreams) { | ||
@@ -64,3 +73,3 @@ this.destroySession(session); | ||
fulfilled = true; | ||
rejectOriginal(err); | ||
reject(err); | ||
}; | ||
@@ -92,3 +101,3 @@ const queryString = (0, querystring_builder_1.buildQueryString)(query || {}); | ||
timeoutError.name = "TimeoutError"; | ||
reject(timeoutError); | ||
rejectWithDestroy(timeoutError); | ||
}); | ||
@@ -101,11 +110,11 @@ } | ||
abortError.name = "AbortError"; | ||
reject(abortError); | ||
rejectWithDestroy(abortError); | ||
}; | ||
} | ||
req.on("frameError", (type, code, id) => { | ||
reject(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); | ||
rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); | ||
}); | ||
req.on("error", reject); | ||
req.on("error", rejectWithDestroy); | ||
req.on("aborted", () => { | ||
reject(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`)); | ||
rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`)); | ||
}); | ||
@@ -118,6 +127,6 @@ req.on("close", () => { | ||
if (!fulfilled) { | ||
reject(new Error("Unexpected error: http2 request did not get a response")); | ||
rejectWithDestroy(new Error("Unexpected error: http2 request did not get a response")); | ||
} | ||
}); | ||
(0, write_request_body_1.writeRequestBody)(req, request); | ||
writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, requestTimeout); | ||
}); | ||
@@ -124,0 +133,0 @@ } |
@@ -5,12 +5,20 @@ "use strict"; | ||
const stream_1 = require("stream"); | ||
function writeRequestBody(httpRequest, request) { | ||
const expect = request.headers["Expect"] || request.headers["expect"]; | ||
const MIN_WAIT_TIME = 1000; | ||
async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) { | ||
var _a; | ||
const headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {}; | ||
const expect = headers["Expect"] || headers["expect"]; | ||
if (expect === "100-continue") { | ||
httpRequest.on("continue", () => { | ||
writeBody(httpRequest, request.body); | ||
}); | ||
await Promise.race([ | ||
new Promise((resolve) => { | ||
setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)); | ||
}), | ||
new Promise((resolve) => { | ||
httpRequest.on("continue", () => { | ||
resolve(); | ||
}); | ||
}), | ||
]); | ||
} | ||
else { | ||
writeBody(httpRequest, request.body); | ||
} | ||
writeBody(httpRequest, request.body); | ||
} | ||
@@ -17,0 +25,0 @@ exports.writeRequestBody = writeRequestBody; |
@@ -8,5 +8,5 @@ import { HttpResponse } from "@aws-sdk/protocol-http"; | ||
import { setConnectionTimeout } from "./set-connection-timeout"; | ||
import { setSocketKeepAlive } from "./set-socket-keep-alive"; | ||
import { setSocketTimeout } from "./set-socket-timeout"; | ||
import { writeRequestBody } from "./write-request-body"; | ||
import { setSocketKeepAlive } from "./set-socket-keep-alive"; | ||
export const DEFAULT_REQUEST_TIMEOUT = 0; | ||
@@ -48,3 +48,12 @@ export class NodeHttpHandler { | ||
} | ||
return new Promise((resolve, reject) => { | ||
return new Promise((_resolve, _reject) => { | ||
let writeRequestBodyPromise = undefined; | ||
const resolve = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_resolve(arg); | ||
}; | ||
const reject = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_reject(arg); | ||
}; | ||
if (!this.config) { | ||
@@ -103,5 +112,5 @@ throw new Error("Node HTTP request handler config is not resolved"); | ||
} | ||
writeRequestBody(req, request); | ||
writeRequestBodyPromise = writeRequestBody(req, request, this.config.requestTimeout); | ||
}); | ||
} | ||
} |
@@ -36,4 +36,13 @@ import { HttpResponse } from "@aws-sdk/protocol-http"; | ||
const { requestTimeout, disableConcurrentStreams } = this.config; | ||
return new Promise((resolve, rejectOriginal) => { | ||
return new Promise((_resolve, _reject) => { | ||
let fulfilled = false; | ||
let writeRequestBodyPromise = undefined; | ||
const resolve = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_resolve(arg); | ||
}; | ||
const reject = async (arg) => { | ||
await writeRequestBodyPromise; | ||
_reject(arg); | ||
}; | ||
if (abortSignal?.aborted) { | ||
@@ -43,3 +52,3 @@ fulfilled = true; | ||
abortError.name = "AbortError"; | ||
rejectOriginal(abortError); | ||
reject(abortError); | ||
return; | ||
@@ -54,3 +63,3 @@ } | ||
}); | ||
const reject = (err) => { | ||
const rejectWithDestroy = (err) => { | ||
if (disableConcurrentStreams) { | ||
@@ -60,3 +69,3 @@ this.destroySession(session); | ||
fulfilled = true; | ||
rejectOriginal(err); | ||
reject(err); | ||
}; | ||
@@ -88,3 +97,3 @@ const queryString = buildQueryString(query || {}); | ||
timeoutError.name = "TimeoutError"; | ||
reject(timeoutError); | ||
rejectWithDestroy(timeoutError); | ||
}); | ||
@@ -97,11 +106,11 @@ } | ||
abortError.name = "AbortError"; | ||
reject(abortError); | ||
rejectWithDestroy(abortError); | ||
}; | ||
} | ||
req.on("frameError", (type, code, id) => { | ||
reject(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); | ||
rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); | ||
}); | ||
req.on("error", reject); | ||
req.on("error", rejectWithDestroy); | ||
req.on("aborted", () => { | ||
reject(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`)); | ||
rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`)); | ||
}); | ||
@@ -114,6 +123,6 @@ req.on("close", () => { | ||
if (!fulfilled) { | ||
reject(new Error("Unexpected error: http2 request did not get a response")); | ||
rejectWithDestroy(new Error("Unexpected error: http2 request did not get a response")); | ||
} | ||
}); | ||
writeRequestBody(req, request); | ||
writeRequestBodyPromise = writeRequestBody(req, request, requestTimeout); | ||
}); | ||
@@ -120,0 +129,0 @@ } |
import { Readable } from "stream"; | ||
export function writeRequestBody(httpRequest, request) { | ||
const expect = request.headers["Expect"] || request.headers["expect"]; | ||
const MIN_WAIT_TIME = 1000; | ||
export async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) { | ||
const headers = request.headers ?? {}; | ||
const expect = headers["Expect"] || headers["expect"]; | ||
if (expect === "100-continue") { | ||
httpRequest.on("continue", () => { | ||
writeBody(httpRequest, request.body); | ||
}); | ||
await Promise.race([ | ||
new Promise((resolve) => { | ||
setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)); | ||
}), | ||
new Promise((resolve) => { | ||
httpRequest.on("continue", () => { | ||
resolve(); | ||
}); | ||
}), | ||
]); | ||
} | ||
else { | ||
writeBody(httpRequest, request.body); | ||
} | ||
writeBody(httpRequest, request.body); | ||
} | ||
@@ -13,0 +20,0 @@ function writeBody(httpRequest, body) { |
@@ -6,3 +6,4 @@ import { HttpRequest } from "@aws-sdk/types"; | ||
httpRequest: ClientRequest | ClientHttp2Stream, | ||
request: HttpRequest | ||
): void; | ||
request: HttpRequest, | ||
maxContinueTimeoutMs?: number | ||
): Promise<void>; |
@@ -6,2 +6,9 @@ /// <reference types="node" /> | ||
import { ClientHttp2Stream } from "http2"; | ||
export declare function writeRequestBody(httpRequest: ClientRequest | ClientHttp2Stream, request: HttpRequest): void; | ||
/** | ||
* This resolves when writeBody has been called. | ||
* | ||
* @param httpRequest - opened Node.js request. | ||
* @param request - container with the request body. | ||
* @param maxContinueTimeoutMs - maximum time to wait for the continue event. Minimum of 1000ms. | ||
*/ | ||
export declare function writeRequestBody(httpRequest: ClientRequest | ClientHttp2Stream, request: HttpRequest, maxContinueTimeoutMs?: number): Promise<void>; |
{ | ||
"name": "@aws-sdk/node-http-handler", | ||
"version": "3.329.0", | ||
"version": "3.337.0", | ||
"description": "Provides a way to make requests", | ||
@@ -25,6 +25,6 @@ "scripts": { | ||
"dependencies": { | ||
"@aws-sdk/abort-controller": "3.329.0", | ||
"@aws-sdk/protocol-http": "3.329.0", | ||
"@aws-sdk/querystring-builder": "3.329.0", | ||
"@aws-sdk/types": "3.329.0", | ||
"@aws-sdk/abort-controller": "3.337.0", | ||
"@aws-sdk/protocol-http": "3.337.0", | ||
"@aws-sdk/querystring-builder": "3.337.0", | ||
"@aws-sdk/types": "3.337.0", | ||
"tslib": "^2.5.0" | ||
@@ -31,0 +31,0 @@ }, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
74935
1566
+ Added@aws-sdk/abort-controller@3.337.0(transitive)
+ Added@aws-sdk/protocol-http@3.337.0(transitive)
+ Added@aws-sdk/querystring-builder@3.337.0(transitive)
+ Added@aws-sdk/types@3.337.0(transitive)
- Removed@aws-sdk/abort-controller@3.329.0(transitive)
- Removed@aws-sdk/protocol-http@3.329.0(transitive)
- Removed@aws-sdk/querystring-builder@3.329.0(transitive)
- Removed@aws-sdk/types@3.329.0(transitive)
Updated@aws-sdk/types@3.337.0