@@ -89,6 +89,7 @@ class HttpURLConnectionClient implements ClientInterface {
8989 return this . doRequest ( httpConnection , json ) ;
9090 }
9191
92+ // create Request object
9293 private createRequest ( endpoint : string , requestOptions : IRequest . Options , applicationName ?: string ) : ClientRequest {
9394 if ( ! requestOptions . headers ) {
9495 requestOptions . headers = { } ;
@@ -141,6 +142,7 @@ class HttpURLConnectionClient implements ClientInterface {
141142 return req ;
142143 }
143144
145+ // invoke request
144146 private doRequest ( connectionRequest : ClientRequest , json : string ) : Promise < string > {
145147 return new Promise ( ( resolve , reject ) : void => {
146148 connectionRequest . flushHeaders ( ) ;
@@ -171,7 +173,34 @@ class HttpURLConnectionClient implements ClientInterface {
171173 reject ( new Error ( "The connection was terminated while the message was still being sent" ) ) ;
172174 }
173175
174- if ( res . statusCode && ( res . statusCode < 200 || res . statusCode >= 300 ) ) {
176+ // Handle 308 redirect
177+ if ( res . statusCode && res . statusCode == 308 ) {
178+ const location = res . headers [ 'location' ] ;
179+ if ( location ) {
180+ // follow the redirect
181+ try {
182+ const url = new URL ( location ) ;
183+
184+ const newRequestOptions = {
185+ hostname : url . hostname ,
186+ port : url . port || ( url . protocol === 'https:' ? 443 : 80 ) ,
187+ path : url . pathname + url . search ,
188+ method : connectionRequest . method ,
189+ headers : connectionRequest . getHeaders ( ) ,
190+ protocol : url . protocol ,
191+ } ;
192+ const redirectedRequest = ( url . protocol === 'https:' ? require ( 'https' ) : require ( 'http' ) ) . request ( newRequestOptions ) ;
193+ const redirectResponse = this . doRequest ( redirectedRequest , json ) ;
194+ return resolve ( redirectResponse ) ;
195+ } catch ( err ) {
196+ return reject ( err ) ;
197+ }
198+ } else {
199+ return reject ( new Error ( `Redirect status ${ res . statusCode } but no Location header` ) ) ;
200+ }
201+ }
202+
203+ if ( res . statusCode && ( res . statusCode < 200 || res . statusCode >= 400 ) ) {
175204 // API error handling
176205 try {
177206 const formattedData : ApiError | { [ key : string ] : never } = JSON . parse ( response . body ) ;
0 commit comments