11import { HttpRequest , HttpResponse } from "@smithy/protocol-http" ;
2+ import { toUtf8 } from "@smithy/util-utf8" ;
3+ import { Readable } from "stream" ;
24
35import { throw200ExceptionsMiddleware } from "./throw-200-exceptions" ;
46
57describe ( "throw200ExceptionsMiddlewareOptions" , ( ) => {
68 const mockNextHandler = jest . fn ( ) ;
7- const mockStreamCollector = jest . fn ( ) ;
8- const mockUtf8Encoder = jest . fn ( ) ;
99 const mockResponse = jest . fn ( ) ;
1010 const mockConfig = {
11- streamCollector : mockStreamCollector ,
12- utf8Encoder : mockUtf8Encoder ,
11+ utf8Encoder : toUtf8 ,
1312 } ;
1413
1514 beforeEach ( ( ) => {
1615 jest . clearAllMocks ( ) ;
1716 } ) ;
1817
1918 describe ( "tests for statusCode < 200 and >= 300" , ( ) => {
20- mockStreamCollector . mockResolvedValue ( Buffer . from ( "" ) ) ;
21- mockUtf8Encoder . mockReturnValue ( "" ) ;
22-
2319 it . each ( [ 199 , 300 ] ) ( "results for statusCode %i" , async ( statusCode ) => {
2420 mockNextHandler . mockReturnValue ( {
2521 response : mockResponse ,
@@ -39,13 +35,11 @@ describe("throw200ExceptionsMiddlewareOptions", () => {
3935
4036 it ( "should throw if response body is empty" , async ( ) => {
4137 expect . assertions ( 3 ) ;
42- mockStreamCollector . mockResolvedValue ( Buffer . from ( "" ) ) ;
43- mockUtf8Encoder . mockReturnValue ( "" ) ;
4438 mockNextHandler . mockReturnValue ( {
4539 response : new HttpResponse ( {
4640 statusCode : 200 ,
4741 headers : { } ,
48- body : "" ,
42+ body : Readable . from ( Buffer . from ( "" ) ) ,
4943 } ) ,
5044 } ) ;
5145 const handler = throw200ExceptionsMiddleware ( mockConfig ) ( mockNextHandler , {
@@ -73,13 +67,11 @@ describe("throw200ExceptionsMiddlewareOptions", () => {
7367 <RequestId>656c76696e6727732072657175657374</RequestId>
7468 <HostId>Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg==</HostId>
7569 </Error>` ;
76- mockStreamCollector . mockResolvedValue ( Buffer . from ( errorBody ) ) ;
77- mockUtf8Encoder . mockReturnValue ( errorBody ) ;
7870 mockNextHandler . mockReturnValue ( {
7971 response : new HttpResponse ( {
8072 statusCode : 200 ,
8173 headers : { } ,
82- body : "" ,
74+ body : Readable . from ( Buffer . from ( errorBody ) ) ,
8375 } ) ,
8476 } ) ;
8577 const handler = throw200ExceptionsMiddleware ( mockConfig ) ( mockNextHandler , { } as any ) ;
@@ -106,13 +98,40 @@ describe("throw200ExceptionsMiddlewareOptions", () => {
10698 <Message>Access Denied</Message>
10799 </Error>
108100</DeleteResult>` ;
109- mockStreamCollector . mockResolvedValue ( Buffer . from ( errorBody ) ) ;
110- mockUtf8Encoder . mockReturnValue ( errorBody ) ;
111101 mockNextHandler . mockReturnValue ( {
112102 response : new HttpResponse ( {
113103 statusCode : 200 ,
114104 headers : { } ,
115- body : "" ,
105+ body : Readable . from ( Buffer . from ( errorBody ) ) ,
106+ } ) ,
107+ } ) ;
108+ const handler = throw200ExceptionsMiddleware ( mockConfig ) ( mockNextHandler , { } as any ) ;
109+ const { response } = await handler ( {
110+ input : { } ,
111+ request : new HttpRequest ( {
112+ hostname : "s3.us-east-1.amazonaws.com" ,
113+ } ) ,
114+ } ) ;
115+ expect ( HttpResponse . isInstance ( response ) ) . toBe ( true ) ;
116+ // @ts -ignore
117+ expect ( response . statusCode ) . toEqual ( 200 ) ;
118+ } ) ;
119+
120+ /**
121+ * This is an exception to the specification. We cannot afford to read
122+ * a streaming body for its entire duration just to check for an extremely unlikely
123+ * terminating XML tag if the stream is very long.
124+ */
125+ it ( "should not throw if the Error tag is on an excessively long body" , async ( ) => {
126+ const errorBody = `<?xml version="1.0" encoding="UTF-8"?>
127+ <Error xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
128+ ${ "a" . repeat ( 3000 ) }
129+ </Error>` ;
130+ mockNextHandler . mockReturnValue ( {
131+ response : new HttpResponse ( {
132+ statusCode : 200 ,
133+ headers : { } ,
134+ body : Readable . from ( Buffer . from ( errorBody ) ) ,
116135 } ) ,
117136 } ) ;
118137 const handler = throw200ExceptionsMiddleware ( mockConfig ) ( mockNextHandler , { } as any ) ;
0 commit comments