diff --git a/lib/http-client.ts b/lib/http-client.ts index 19592dd0..d0ac9487 100644 --- a/lib/http-client.ts +++ b/lib/http-client.ts @@ -1,6 +1,7 @@ import * as initDebug from 'debug'; import * as _fetch from 'node-fetch'; -import { IRangeRequestClient, IContentRangeType, IHeadRequestInfo, IRangeRequestResponse } from '@tokenizer/range'; // Add 'fetch' API for node.js +import { IContentRangeType, IHeadRequestInfo, IRangeRequestResponse } from '@tokenizer/range'; // Add 'fetch' API for node.js +import { IHttpClient } from './types'; const debug = initDebug('streaming-http-token-reader:http-client'); @@ -28,7 +29,7 @@ export function parseContentRange(contentRange: string): IContentRangeType { /** * Simple HTTP-client, which both works in node.js and browser */ -export class HttpClient implements IRangeRequestClient { +export class HttpClient implements IHttpClient { private static getContentLength(headers: _fetch.Headers): number { const contentLength = headers.get('Content-Length'); @@ -43,6 +44,7 @@ export class HttpClient implements IRangeRequestClient { private static makeResponse(resp): IRangeRequestResponse { const contentRange = HttpClient.parseContentRange(resp.headers); return { + url: resp.url, size: contentRange ? contentRange.instanceLength : HttpClient.getContentLength(resp.headers), mimeType: resp.headers.get('Content-Type'), contentRange, @@ -50,11 +52,16 @@ export class HttpClient implements IRangeRequestClient { }; } + public resolvedUrl: string; + constructor(private url: string) { } public getHeadInfo(): Promise { - return _fetch(this.url, {method: 'HEAD'}).then(resp => HttpClient.makeResponse(resp)); + return _fetch(this.url, {method: 'HEAD'}).then(resp => { + this.resolvedUrl = resp.url; + return HttpClient.makeResponse(resp); + }); } public getResponse(method: string, range?: [number, number]): Promise { @@ -67,9 +74,9 @@ export class HttpClient implements IRangeRequestClient { const headers = new _fetch.Headers(); headers.set('Range', 'bytes=' + range[0] + '-' + range[1]); - return _fetch(this.url, {method, headers}).then(response => { - + return _fetch(this.resolvedUrl || this.url, {method, headers}).then(response => { if (response.ok) { + this.resolvedUrl = response.url; return HttpClient.makeResponse(response); } else { throw new Error(`Unexpected HTTP response status=${response.status}`); diff --git a/lib/types.ts b/lib/types.ts index 31bab3a1..2e62dcdd 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,3 +1,5 @@ +import { IRangeRequestClient } from '@tokenizer/range'; + export interface IContentRangeType { firstBytePosition?: number; lastBytePosition?: number; @@ -14,9 +16,6 @@ export interface IHttpResponse extends IHeadInfo { arrayBuffer: () => Promise; } -export interface IHttpClient { - - getHeadInfo?(): Promise; - - getResponse(method: string, range?: [number, number]): Promise; +export interface IHttpClient extends IRangeRequestClient { + resolvedUrl?: string; }