diff --git a/spec/core/HTTPClient.ts b/spec/core/HTTPClient.ts index 8c00d9aee..f4a70c5ef 100644 --- a/spec/core/HTTPClient.ts +++ b/spec/core/HTTPClient.ts @@ -7,9 +7,13 @@ import { assert } from "chai"; +import { Client } from "../../src/Client"; import { HTTPClient } from "../../src/HTTPClient"; import { Context } from "../../src/IContext"; import { FetchOptions } from "../../src/IFetchOptions"; +import { RedirectHandlerOptions } from "../../src/middleware/options/RedirectHandlerOptions"; +import { RedirectHandler } from "../../src/middleware/RedirectHandler"; +import { TelemetryHandler } from "../../src/middleware/TelemetryHandler"; import { DummyHTTPMessageHandler } from "../DummyHTTPMessageHandler"; describe("HTTPClient.ts", () => { @@ -68,4 +72,39 @@ describe("HTTPClient.ts", () => { } }); }); + + describe("getMiddlewareArray", () => { + it("Should work fine for a single middleware in the chain, which does have a getNext method", () => { + const telemetryHandler = new TelemetryHandler(); + const tempHttpClient: HTTPClient = new HTTPClient(telemetryHandler); + assert.equal(tempHttpClient.getMiddlewareArray().length, 1); + }); + + it("Should work fine for a single middleware in the chain, which doesn't have a getNext method", () => { + const tempHttpClient: HTTPClient = new HTTPClient(httpMessageHandler); + assert.equal(tempHttpClient.getMiddlewareArray().length, 1); + }); + + it("Should work fine for a chain containing many middlewares", () => { + const telemetryHandler = new TelemetryHandler(); + const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); + redirectHandler.setNext(telemetryHandler); + telemetryHandler.setNext(httpMessageHandler); + const tempHttpClient: HTTPClient = new HTTPClient(redirectHandler); + assert.equal(tempHttpClient.getMiddlewareArray().length, 3); + }); + }); + + describe("setMiddlewareArray", () => { + it("Should make a chain out of the provided array of middlewares", () => { + const telemetryHandler = new TelemetryHandler(); + const redirectHandler = new RedirectHandler(new RedirectHandlerOptions()); + redirectHandler.setNext(httpMessageHandler); + const tempHttpClient: HTTPClient = new HTTPClient(redirectHandler); + const middlewareArray = tempHttpClient.getMiddlewareArray(); + middlewareArray.splice(1, 0, telemetryHandler); + tempHttpClient.setMiddlewareArray(middlewareArray); + assert.equal(tempHttpClient.getMiddlewareArray().length, 3); + }); + }); }); diff --git a/src/Client.ts b/src/Client.ts index 0cd9b04c8..610144447 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -16,6 +16,7 @@ import { HTTPClient } from "./HTTPClient"; import { HTTPClientFactory } from "./HTTPClientFactory"; import { ClientOptions } from "./IClientOptions"; import { Options } from "./IOptions"; +import { Middleware } from "./middleware/IMiddleware"; import { validatePolyFilling } from "./ValidatePolyFilling"; export class Client { @@ -103,6 +104,24 @@ export class Client { this.httpClient = httpClient; } + /** + * @public + * function to get the array of middlewares in use right now + * @returns An array of middlewares + */ + public getMiddlewareChain() { + return this.httpClient.getMiddlewareArray(); + } + + /** + * @public + * function to set the middleware chain + * @param {Middleware[]} middlewareArray - An array of middlewares + */ + public setMiddlewareChain(middlewareArray: Middleware[]) { + return this.httpClient.setMiddlewareArray(middlewareArray); + } + /** * @public * Entry point to make requests diff --git a/src/HTTPClient.ts b/src/HTTPClient.ts index 2276fb227..ba4c3cf0a 100644 --- a/src/HTTPClient.ts +++ b/src/HTTPClient.ts @@ -33,6 +33,37 @@ export class HTTPClient { this.middleware = middleware; } + /** + * @public + * To get an array of Middleware, used in middleware chain + * @returns An array of middlewares + */ + public getMiddlewareArray(): Middleware[] { + const middlewareArray: Middleware[] = []; + let currentMiddleware = this.middleware; + while (currentMiddleware) { + middlewareArray.push(currentMiddleware); + if (typeof currentMiddleware.getNext !== "undefined") { + currentMiddleware = currentMiddleware.getNext(); + } else { + break; + } + } + return middlewareArray; + } + + /** + * @public + * To set the middleware chain + * @param {Middleware[]} middlewareArray - The array containing the middlewares + */ + public setMiddlewareArray(middlewareArray: Middleware[]) { + for (let num = 0; num < middlewareArray.length - 1; num += 1) { + middlewareArray[num].setNext(middlewareArray[num + 1]); + } + this.middleware = middlewareArray[0]; + } + /** * @public * @async diff --git a/src/middleware/AuthenticationHandler.ts b/src/middleware/AuthenticationHandler.ts index 3275c6092..358d900f9 100644 --- a/src/middleware/AuthenticationHandler.ts +++ b/src/middleware/AuthenticationHandler.ts @@ -94,4 +94,13 @@ export class AuthenticationHandler implements Middleware { public setNext(next: Middleware): void { this.nextMiddleware = next; } + + /** + * @public + * To get the next middleware in the chain + * @returns next Middleware instance + */ + public getNext(): Middleware { + return this.nextMiddleware; + } } diff --git a/src/middleware/IMiddleware.ts b/src/middleware/IMiddleware.ts index 70dacc703..51e0821d0 100644 --- a/src/middleware/IMiddleware.ts +++ b/src/middleware/IMiddleware.ts @@ -15,4 +15,5 @@ import { Context } from "../IContext"; export interface Middleware { execute: (context: Context) => Promise; setNext?: (middleware: Middleware) => void; + getNext?: () => Middleware; } diff --git a/src/middleware/RedirectHandler.ts b/src/middleware/RedirectHandler.ts index 4bdcc9e39..5878062e5 100644 --- a/src/middleware/RedirectHandler.ts +++ b/src/middleware/RedirectHandler.ts @@ -243,4 +243,13 @@ export class RedirectHandler implements Middleware { public setNext(next: Middleware): void { this.nextMiddleware = next; } + + /** + * @public + * To get the next middleware in the chain + * @returns next Middleware instance + */ + public getNext(): Middleware { + return this.nextMiddleware; + } } diff --git a/src/middleware/RetryHandler.ts b/src/middleware/RetryHandler.ts index 56b5c22c3..efd159a26 100644 --- a/src/middleware/RetryHandler.ts +++ b/src/middleware/RetryHandler.ts @@ -216,4 +216,13 @@ export class RetryHandler implements Middleware { public setNext(next: Middleware): void { this.nextMiddleware = next; } + + /** + * @public + * To get the next middleware in the chain + * @returns next Middleware instance + */ + public getNext(): Middleware { + return this.nextMiddleware; + } } diff --git a/src/middleware/TelemetryHandler.ts b/src/middleware/TelemetryHandler.ts index e72d2c187..1d1b09dec 100644 --- a/src/middleware/TelemetryHandler.ts +++ b/src/middleware/TelemetryHandler.ts @@ -96,4 +96,13 @@ export class TelemetryHandler implements Middleware { public setNext(next: Middleware): void { this.nextMiddleware = next; } + + /** + * @public + * To get the next middleware in the chain + * @returns next Middleware instance + */ + public getNext(): Middleware { + return this.nextMiddleware; + } }