UNPKG

5.09 kBPlain TextView Raw
1/**
2 * -------------------------------------------------------------------------------------------
3 * Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License.
4 * See License in the project root for license information.
5 * -------------------------------------------------------------------------------------------
6 */
7
8/**
9 * @module MiddlewareUtil
10 */
11
12import { FetchOptions } from "../IFetchOptions";
13
14/**
15 * @constant
16 * To generate the UUID
17 * @returns The UUID string
18 */
19export const generateUUID = (): string => {
20 let uuid = "";
21 for (let j = 0; j < 32; j++) {
22 if (j === 8 || j === 12 || j === 16 || j === 20) {
23 uuid += "-";
24 }
25 uuid += Math.floor(Math.random() * 16).toString(16);
26 }
27 return uuid;
28};
29
30/**
31 * @constant
32 * To get the request header from the request
33 * @param {RequestInfo} request - The request object or the url string
34 * @param {FetchOptions|undefined} options - The request options object
35 * @param {string} key - The header key string
36 * @returns A header value for the given key from the request
37 */
38export const getRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string): string | null => {
39 let value: string = null;
40 if (typeof Request !== "undefined" && request instanceof Request) {
41 value = (request as Request).headers.get(key);
42 } else if (typeof options !== "undefined" && options.headers !== undefined) {
43 if (typeof Headers !== "undefined" && options.headers instanceof Headers) {
44 value = (options.headers as Headers).get(key);
45 } else if (options.headers instanceof Array) {
46 const headers = options.headers as string[][];
47 for (let i = 0, l = headers.length; i < l; i++) {
48 if (headers[i][0] === key) {
49 value = headers[i][1];
50 break;
51 }
52 }
53 } else if (options.headers[key] !== undefined) {
54 value = options.headers[key];
55 }
56 }
57 return value;
58};
59
60/**
61 * @constant
62 * To set the header value to the given request
63 * @param {RequestInfo} request - The request object or the url string
64 * @param {FetchOptions|undefined} options - The request options object
65 * @param {string} key - The header key string
66 * @param {string } value - The header value string
67 * @returns Nothing
68 */
69export const setRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => {
70 if (typeof Request !== "undefined" && request instanceof Request) {
71 (request as Request).headers.set(key, value);
72 } else if (typeof options !== "undefined") {
73 if (options.headers === undefined) {
74 options.headers = new Headers({
75 [key]: value,
76 });
77 } else {
78 if (typeof Headers !== "undefined" && options.headers instanceof Headers) {
79 (options.headers as Headers).set(key, value);
80 } else if (options.headers instanceof Array) {
81 let i = 0;
82 const l = options.headers.length;
83 for (; i < l; i++) {
84 const header = options.headers[i];
85 if (header[0] === key) {
86 header[1] = value;
87 break;
88 }
89 }
90 if (i === l) {
91 (options.headers as string[][]).push([key, value]);
92 }
93 } else {
94 Object.assign(options.headers, { [key]: value });
95 }
96 }
97 }
98};
99
100/**
101 * @constant
102 * To append the header value to the given request
103 * @param {RequestInfo} request - The request object or the url string
104 * @param {FetchOptions|undefined} options - The request options object
105 * @param {string} key - The header key string
106 * @param {string } value - The header value string
107 * @returns Nothing
108 */
109export const appendRequestHeader = (request: RequestInfo, options: FetchOptions | undefined, key: string, value: string): void => {
110 if (typeof Request !== "undefined" && request instanceof Request) {
111 (request as Request).headers.append(key, value);
112 } else if (typeof options !== "undefined") {
113 if (options.headers === undefined) {
114 options.headers = new Headers({
115 [key]: value,
116 });
117 } else {
118 if (typeof Headers !== "undefined" && options.headers instanceof Headers) {
119 (options.headers as Headers).append(key, value);
120 } else if (options.headers instanceof Array) {
121 (options.headers as string[][]).push([key, value]);
122 } else if (options.headers === undefined) {
123 options.headers = { [key]: value };
124 } else if (options.headers[key] === undefined) {
125 options.headers[key] = value;
126 } else {
127 options.headers[key] += `, ${value}`;
128 }
129 }
130 }
131};
132
133/**
134 * @constant
135 * To clone the request with the new url
136 * @param {string} url - The new url string
137 * @param {Request} request - The request object
138 * @returns A promise that resolves to request object
139 */
140export const cloneRequestWithNewUrl = async (newUrl: string, request: Request): Promise<Request> => {
141 const body = request.headers.get("Content-Type") ? await request.blob() : await Promise.resolve(undefined);
142 const { method, headers, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal } = request;
143 return new Request(newUrl, { method, headers, body, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal });
144};