Skip to content

Commit a3ce4d9

Browse files
committed
Handle 308 redirect
1 parent ccfa1d1 commit a3ce4d9

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

src/httpClient/httpURLConnectionClient.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)