blob: 97c036b15153bd9aa3efd85ffe3b110df5b4845a [file] [log] [blame]
{"version":3,"file":"http.js","sources":["../../../../../../packages/common/http/src/backend.ts","../../../../../../packages/common/http/src/headers.ts","../../../../../../packages/common/http/src/params.ts","../../../../../../packages/common/http/src/request.ts","../../../../../../packages/common/http/src/response.ts","../../../../../../packages/common/http/src/client.ts","../../../../../../packages/common/http/src/interceptor.ts","../../../../../../packages/common/http/src/jsonp.ts","../../../../../../packages/common/http/src/xhr.ts","../../../../../../packages/common/http/src/xsrf.ts","../../../../../../packages/common/http/src/module.ts","../../../../../../packages/common/http/public_api.ts","../../../../../../packages/common/http/index.ts","../../../../../../packages/common/http/http.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Observable} from 'rxjs';\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\n\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * @publicApi\n */\nexport abstract class HttpHandler {\n abstract handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;\n}\n\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * @publicApi\n */\nexport abstract class HttpBackend implements HttpHandler {\n abstract handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\ninterface Update {\n name: string;\n value?: string|string[];\n op: 'a'|'s'|'d';\n}\n\n/**\n * `HttpHeaders` class represents the header configuration options for an HTTP request.\n * Instances should be assumed immutable with lazy parsing.\n *\n * @publicApi\n */\nexport class HttpHeaders {\n /**\n * Internal map of lowercase header names to values.\n */\n // TODO(issue/24571): remove '!'.\n private headers !: Map<string, string[]>;\n\n\n /**\n * Internal map of lowercased header names to the normalized\n * form of the name (the form seen first).\n */\n private normalizedNames: Map<string, string> = new Map();\n\n /**\n * Complete the lazy initialization of this object (needed before reading).\n */\n // TODO(issue/24571): remove '!'.\n private lazyInit !: HttpHeaders | Function | null;\n\n /**\n * Queued updates to be materialized the next initialization.\n */\n private lazyUpdate: Update[]|null = null;\n\n /** Constructs a new HTTP header object with the given values.*/\n\n constructor(headers?: string|{[name: string]: string | string[]}) {\n if (!headers) {\n this.headers = new Map<string, string[]>();\n } else if (typeof headers === 'string') {\n this.lazyInit = () => {\n this.headers = new Map<string, string[]>();\n headers.split('\\n').forEach(line => {\n const index = line.indexOf(':');\n if (index > 0) {\n const name = line.slice(0, index);\n const key = name.toLowerCase();\n const value = line.slice(index + 1).trim();\n this.maybeSetNormalizedName(name, key);\n if (this.headers.has(key)) {\n this.headers.get(key) !.push(value);\n } else {\n this.headers.set(key, [value]);\n }\n }\n });\n };\n } else {\n this.lazyInit = () => {\n this.headers = new Map<string, string[]>();\n Object.keys(headers).forEach(name => {\n let values: string|string[] = headers[name];\n const key = name.toLowerCase();\n if (typeof values === 'string') {\n values = [values];\n }\n if (values.length > 0) {\n this.headers.set(key, values);\n this.maybeSetNormalizedName(name, key);\n }\n });\n };\n }\n }\n\n /**\n * Checks for existence of a header by a given name.\n *\n * @param name The header name to check for existence.\n *\n * @returns Whether the header exits.\n */\n has(name: string): boolean {\n this.init();\n\n return this.headers.has(name.toLowerCase());\n }\n\n /**\n * Returns the first header value that matches a given name.\n *\n * @param name The header name to retrieve.\n *\n * @returns A string if the header exists, null otherwise\n */\n get(name: string): string|null {\n this.init();\n\n const values = this.headers.get(name.toLowerCase());\n return values && values.length > 0 ? values[0] : null;\n }\n\n /**\n * Returns the names of the headers.\n *\n * @returns A list of header names.\n */\n keys(): string[] {\n this.init();\n\n return Array.from(this.normalizedNames.values());\n }\n\n /**\n * Returns a list of header values for a given header name.\n *\n * @param name The header name from which to retrieve the values.\n *\n * @returns A string of values if the header exists, null otherwise.\n */\n getAll(name: string): string[]|null {\n this.init();\n\n return this.headers.get(name.toLowerCase()) || null;\n }\n\n /**\n * Appends a new header value to the existing set of\n * header values.\n *\n * @param name The header name for which to append the values.\n *\n * @returns A clone of the HTTP header object with the value appended.\n */\n\n append(name: string, value: string|string[]): HttpHeaders {\n return this.clone({name, value, op: 'a'});\n }\n /**\n * Sets a header value for a given name. If the header name already exists,\n * its value is replaced with the given value.\n *\n * @param name The header name.\n * @param value Provides the value to set or overide for a given name.\n *\n * @returns A clone of the HTTP header object with the newly set header value.\n */\n set(name: string, value: string|string[]): HttpHeaders {\n return this.clone({name, value, op: 's'});\n }\n /**\n * Deletes all header values for a given name.\n *\n * @param name The header name.\n * @param value The header values to delete for a given name.\n *\n * @returns A clone of the HTTP header object.\n */\n delete (name: string, value?: string|string[]): HttpHeaders {\n return this.clone({name, value, op: 'd'});\n }\n\n private maybeSetNormalizedName(name: string, lcName: string): void {\n if (!this.normalizedNames.has(lcName)) {\n this.normalizedNames.set(lcName, name);\n }\n }\n\n private init(): void {\n if (!!this.lazyInit) {\n if (this.lazyInit instanceof HttpHeaders) {\n this.copyFrom(this.lazyInit);\n } else {\n this.lazyInit();\n }\n this.lazyInit = null;\n if (!!this.lazyUpdate) {\n this.lazyUpdate.forEach(update => this.applyUpdate(update));\n this.lazyUpdate = null;\n }\n }\n }\n\n private copyFrom(other: HttpHeaders) {\n other.init();\n Array.from(other.headers.keys()).forEach(key => {\n this.headers.set(key, other.headers.get(key) !);\n this.normalizedNames.set(key, other.normalizedNames.get(key) !);\n });\n }\n\n private clone(update: Update): HttpHeaders {\n const clone = new HttpHeaders();\n clone.lazyInit =\n (!!this.lazyInit && this.lazyInit instanceof HttpHeaders) ? this.lazyInit : this;\n clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n return clone;\n }\n\n private applyUpdate(update: Update): void {\n const key = update.name.toLowerCase();\n switch (update.op) {\n case 'a':\n case 's':\n let value = update.value !;\n if (typeof value === 'string') {\n value = [value];\n }\n if (value.length === 0) {\n return;\n }\n this.maybeSetNormalizedName(update.name, key);\n const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n base.push(...value);\n this.headers.set(key, base);\n break;\n case 'd':\n const toDelete = update.value as string | undefined;\n if (!toDelete) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n } else {\n let existing = this.headers.get(key);\n if (!existing) {\n return;\n }\n existing = existing.filter(value => toDelete.indexOf(value) === -1);\n if (existing.length === 0) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n } else {\n this.headers.set(key, existing);\n }\n }\n break;\n }\n }\n\n /**\n * @internal\n */\n forEach(fn: (name: string, values: string[]) => void) {\n this.init();\n Array.from(this.normalizedNames.keys())\n .forEach(key => fn(this.normalizedNames.get(key) !, this.headers.get(key) !));\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * A codec for encoding and decoding parameters in URLs.\n *\n * Used by `HttpParams`.\n *\n * @publicApi\n **/\nexport interface HttpParameterCodec {\n encodeKey(key: string): string;\n encodeValue(value: string): string;\n\n decodeKey(key: string): string;\n decodeValue(value: string): string;\n}\n\n/**\n * A class that uses `encodeURIComponent` and `decodeURIComponent` to\n * serialize and parse URL parameter keys and values. If you pass URL query parameters\n * without encoding, the query parameters can get misinterpreted at the receiving end.\n * Use the `HttpParameterCodec` class to encode and decode the query-string values.\n *\n * @publicApi\n */\nexport class HttpUrlEncodingCodec implements HttpParameterCodec {\n encodeKey(key: string): string { return standardEncoding(key); }\n\n encodeValue(value: string): string { return standardEncoding(value); }\n\n decodeKey(key: string): string { return decodeURIComponent(key); }\n\n decodeValue(value: string) { return decodeURIComponent(value); }\n}\n\n\nfunction paramParser(rawParams: string, codec: HttpParameterCodec): Map<string, string[]> {\n const map = new Map<string, string[]>();\n if (rawParams.length > 0) {\n const params: string[] = rawParams.split('&');\n params.forEach((param: string) => {\n const eqIdx = param.indexOf('=');\n const [key, val]: string[] = eqIdx == -1 ?\n [codec.decodeKey(param), ''] :\n [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];\n const list = map.get(key) || [];\n list.push(val);\n map.set(key, list);\n });\n }\n return map;\n}\nfunction standardEncoding(v: string): string {\n return encodeURIComponent(v)\n .replace(/%40/gi, '@')\n .replace(/%3A/gi, ':')\n .replace(/%24/gi, '$')\n .replace(/%2C/gi, ',')\n .replace(/%3B/gi, ';')\n .replace(/%2B/gi, '+')\n .replace(/%3D/gi, '=')\n .replace(/%3F/gi, '?')\n .replace(/%2F/gi, '/');\n}\n\ninterface Update {\n param: string;\n value?: string;\n op: 'a'|'d'|'s';\n}\n\n/** Options used to construct an `HttpParams` instance. */\nexport interface HttpParamsOptions {\n /**\n * String representation of the HTTP params in URL-query-string format. Mutually exclusive with\n * `fromObject`.\n */\n fromString?: string;\n\n /** Object map of the HTTP params. Mutually exclusive with `fromString`. */\n fromObject?: {[param: string]: string | string[]};\n\n /** Encoding codec used to parse and serialize the params. */\n encoder?: HttpParameterCodec;\n}\n\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immutable - all mutation operations return a new instance.\n *\n * @publicApi\n */\nexport class HttpParams {\n private map: Map<string, string[]>|null;\n private encoder: HttpParameterCodec;\n private updates: Update[]|null = null;\n private cloneFrom: HttpParams|null = null;\n\n constructor(options: HttpParamsOptions = {} as HttpParamsOptions) {\n this.encoder = options.encoder || new HttpUrlEncodingCodec();\n if (!!options.fromString) {\n if (!!options.fromObject) {\n throw new Error(`Cannot specify both fromString and fromObject.`);\n }\n this.map = paramParser(options.fromString, this.encoder);\n } else if (!!options.fromObject) {\n this.map = new Map<string, string[]>();\n Object.keys(options.fromObject).forEach(key => {\n const value = (options.fromObject as any)[key];\n this.map !.set(key, Array.isArray(value) ? value : [value]);\n });\n } else {\n this.map = null;\n }\n }\n\n /**\n * Check whether the body has one or more values for the given parameter name.\n */\n has(param: string): boolean {\n this.init();\n return this.map !.has(param);\n }\n\n /**\n * Get the first value for the given parameter name, or `null` if it's not present.\n */\n get(param: string): string|null {\n this.init();\n const res = this.map !.get(param);\n return !!res ? res[0] : null;\n }\n\n /**\n * Get all values for the given parameter name, or `null` if it's not present.\n */\n getAll(param: string): string[]|null {\n this.init();\n return this.map !.get(param) || null;\n }\n\n /**\n * Get all the parameter names for this body.\n */\n keys(): string[] {\n this.init();\n return Array.from(this.map !.keys());\n }\n\n /**\n * Construct a new body with an appended value for the given parameter name.\n */\n append(param: string, value: string): HttpParams { return this.clone({param, value, op: 'a'}); }\n\n /**\n * Construct a new body with a new value for the given parameter name.\n */\n set(param: string, value: string): HttpParams { return this.clone({param, value, op: 's'}); }\n\n /**\n * Construct a new body with either the given value for the given parameter\n * removed, if a value is given, or all values for the given parameter removed\n * if not.\n */\n delete (param: string, value?: string): HttpParams { return this.clone({param, value, op: 'd'}); }\n\n /**\n * Serialize the body to an encoded string, where key-value pairs (separated by `=`) are\n * separated by `&`s.\n */\n toString(): string {\n this.init();\n return this.keys()\n .map(key => {\n const eKey = this.encoder.encodeKey(key);\n return this.map !.get(key) !.map(value => eKey + '=' + this.encoder.encodeValue(value))\n .join('&');\n })\n .join('&');\n }\n\n private clone(update: Update): HttpParams {\n const clone = new HttpParams({ encoder: this.encoder } as HttpParamsOptions);\n clone.cloneFrom = this.cloneFrom || this;\n clone.updates = (this.updates || []).concat([update]);\n return clone;\n }\n\n private init() {\n if (this.map === null) {\n this.map = new Map<string, string[]>();\n }\n if (this.cloneFrom !== null) {\n this.cloneFrom.init();\n this.cloneFrom.keys().forEach(key => this.map !.set(key, this.cloneFrom !.map !.get(key) !));\n this.updates !.forEach(update => {\n switch (update.op) {\n case 'a':\n case 's':\n const base = (update.op === 'a' ? this.map !.get(update.param) : undefined) || [];\n base.push(update.value !);\n this.map !.set(update.param, base);\n break;\n case 'd':\n if (update.value !== undefined) {\n let base = this.map !.get(update.param) || [];\n const idx = base.indexOf(update.value);\n if (idx !== -1) {\n base.splice(idx, 1);\n }\n if (base.length > 0) {\n this.map !.set(update.param, base);\n } else {\n this.map !.delete(update.param);\n }\n } else {\n this.map !.delete(update.param);\n break;\n }\n }\n });\n this.cloneFrom = this.updates = null;\n }\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {HttpHeaders} from './headers';\nimport {HttpParams} from './params';\n\n/**\n * Construction interface for `HttpRequest`s.\n *\n * All values are optional and will override default values if provided.\n */\ninterface HttpRequestInit {\n headers?: HttpHeaders;\n reportProgress?: boolean;\n params?: HttpParams;\n responseType?: 'arraybuffer'|'blob'|'json'|'text';\n withCredentials?: boolean;\n}\n\n/**\n * Determine whether the given HTTP method may include a body.\n */\nfunction mightHaveBody(method: string): boolean {\n switch (method) {\n case 'DELETE':\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n case 'JSONP':\n return false;\n default:\n return true;\n }\n}\n\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n */\nfunction isArrayBuffer(value: any): value is ArrayBuffer {\n return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n */\nfunction isBlob(value: any): value is Blob {\n return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n */\nfunction isFormData(value: any): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * @publicApi\n */\nexport class HttpRequest<T> {\n /**\n * The request body, or `null` if one isn't set.\n *\n * Bodies are not enforced to be immutable, as they can include a reference to any\n * user-defined data type. However, interceptors should take care to preserve\n * idempotence by treating them as such.\n */\n readonly body: T|null = null;\n\n /**\n * Outgoing headers for this request.\n */\n // TODO(issue/24571): remove '!'.\n readonly headers !: HttpHeaders;\n\n /**\n * Whether this request should be made in a way that exposes progress events.\n *\n * Progress events are expensive (change detection runs on each event) and so\n * they should only be requested if the consumer intends to monitor them.\n */\n readonly reportProgress: boolean = false;\n\n /**\n * Whether this request should be sent with outgoing credentials (cookies).\n */\n readonly withCredentials: boolean = false;\n\n /**\n * The expected response type of the server.\n *\n * This is used to parse the response appropriately before returning it to\n * the requestee.\n */\n readonly responseType: 'arraybuffer'|'blob'|'json'|'text' = 'json';\n\n /**\n * The outgoing HTTP request method.\n */\n readonly method: string;\n\n /**\n * Outgoing URL parameters.\n */\n // TODO(issue/24571): remove '!'.\n readonly params !: HttpParams;\n\n /**\n * The outgoing URL with all URL parameters set.\n */\n readonly urlWithParams: string;\n\n constructor(method: 'DELETE'|'GET'|'HEAD'|'JSONP'|'OPTIONS', url: string, init?: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n });\n constructor(method: 'POST'|'PUT'|'PATCH', url: string, body: T|null, init?: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n });\n constructor(method: string, url: string, body: T|null, init?: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n });\n constructor(\n method: string, readonly url: string, third?: T|{\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n }|null,\n fourth?: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n }) {\n this.method = method.toUpperCase();\n // Next, need to figure out which argument holds the HttpRequestInit\n // options, if any.\n let options: HttpRequestInit|undefined;\n\n // Check whether a body argument is expected. The only valid way to omit\n // the body argument is to use a known no-body method like GET.\n if (mightHaveBody(this.method) || !!fourth) {\n // Body is the third argument, options are the fourth.\n this.body = (third !== undefined) ? third as T : null;\n options = fourth;\n } else {\n // No body required, options are the third argument. The body stays null.\n options = third as HttpRequestInit;\n }\n\n // If options have been passed, interpret them.\n if (options) {\n // Normalize reportProgress and withCredentials.\n this.reportProgress = !!options.reportProgress;\n this.withCredentials = !!options.withCredentials;\n\n // Override default response type of 'json' if one is provided.\n if (!!options.responseType) {\n this.responseType = options.responseType;\n }\n\n // Override headers if they're provided.\n if (!!options.headers) {\n this.headers = options.headers;\n }\n\n if (!!options.params) {\n this.params = options.params;\n }\n }\n\n // If no headers have been passed in, construct a new HttpHeaders instance.\n if (!this.headers) {\n this.headers = new HttpHeaders();\n }\n\n // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n if (!this.params) {\n this.params = new HttpParams();\n this.urlWithParams = url;\n } else {\n // Encode the parameters to a string in preparation for inclusion in the URL.\n const params = this.params.toString();\n if (params.length === 0) {\n // No parameters, the visible URL is just the URL given at creation time.\n this.urlWithParams = url;\n } else {\n // Does the URL already have query parameters? Look for '?'.\n const qIdx = url.indexOf('?');\n // There are 3 cases to handle:\n // 1) No existing parameters -> append '?' followed by params.\n // 2) '?' exists and is followed by existing query string ->\n // append '&' followed by params.\n // 3) '?' exists at the end of the url -> append params directly.\n // This basically amounts to determining the character, if any, with\n // which to join the URL and parameters.\n const sep: string = qIdx === -1 ? '?' : (qIdx < url.length - 1 ? '&' : '');\n this.urlWithParams = url + sep + params;\n }\n }\n }\n\n /**\n * Transform the free-form body into a serialized format suitable for\n * transmission to the server.\n */\n serializeBody(): ArrayBuffer|Blob|FormData|string|null {\n // If no body is present, no need to serialize it.\n if (this.body === null) {\n return null;\n }\n // Check whether the body is already in a serialized form. If so,\n // it can just be returned directly.\n if (isArrayBuffer(this.body) || isBlob(this.body) || isFormData(this.body) ||\n typeof this.body === 'string') {\n return this.body;\n }\n // Check whether the body is an instance of HttpUrlEncodedParams.\n if (this.body instanceof HttpParams) {\n return this.body.toString();\n }\n // Check whether the body is an object or array, and serialize with JSON if so.\n if (typeof this.body === 'object' || typeof this.body === 'boolean' ||\n Array.isArray(this.body)) {\n return JSON.stringify(this.body);\n }\n // Fall back on toString() for everything else.\n return (this.body as any).toString();\n }\n\n /**\n * Examine the body and attempt to infer an appropriate MIME type\n * for it.\n *\n * If no such type can be inferred, this method will return `null`.\n */\n detectContentTypeHeader(): string|null {\n // An empty body has no content type.\n if (this.body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (isFormData(this.body)) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (isBlob(this.body)) {\n return this.body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (isArrayBuffer(this.body)) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof this.body === 'string') {\n return 'text/plain';\n }\n // `HttpUrlEncodedParams` has its own content-type.\n if (this.body instanceof HttpParams) {\n return 'application/x-www-form-urlencoded;charset=UTF-8';\n }\n // Arrays, objects, and numbers will be encoded as JSON.\n if (typeof this.body === 'object' || typeof this.body === 'number' ||\n Array.isArray(this.body)) {\n return 'application/json';\n }\n // No type could be inferred.\n return null;\n }\n\n clone(): HttpRequest<T>;\n clone(update: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n body?: T|null,\n method?: string,\n url?: string,\n setHeaders?: {[name: string]: string | string[]},\n setParams?: {[param: string]: string},\n }): HttpRequest<T>;\n clone<V>(update: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n body?: V|null,\n method?: string,\n url?: string,\n setHeaders?: {[name: string]: string | string[]},\n setParams?: {[param: string]: string},\n }): HttpRequest<V>;\n clone(update: {\n headers?: HttpHeaders,\n reportProgress?: boolean,\n params?: HttpParams,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n body?: any|null,\n method?: string,\n url?: string,\n setHeaders?: {[name: string]: string | string[]},\n setParams?: {[param: string]: string};\n } = {}): HttpRequest<any> {\n // For method, url, and responseType, take the current value unless\n // it is overridden in the update hash.\n const method = update.method || this.method;\n const url = update.url || this.url;\n const responseType = update.responseType || this.responseType;\n\n // The body is somewhat special - a `null` value in update.body means\n // whatever current body is present is being overridden with an empty\n // body, whereas an `undefined` value in update.body implies no\n // override.\n const body = (update.body !== undefined) ? update.body : this.body;\n\n // Carefully handle the boolean options to differentiate between\n // `false` and `undefined` in the update args.\n const withCredentials =\n (update.withCredentials !== undefined) ? update.withCredentials : this.withCredentials;\n const reportProgress =\n (update.reportProgress !== undefined) ? update.reportProgress : this.reportProgress;\n\n // Headers and params may be appended to if `setHeaders` or\n // `setParams` are used.\n let headers = update.headers || this.headers;\n let params = update.params || this.params;\n\n // Check whether the caller has asked to add headers.\n if (update.setHeaders !== undefined) {\n // Set every requested header.\n headers =\n Object.keys(update.setHeaders)\n .reduce((headers, name) => headers.set(name, update.setHeaders ![name]), headers);\n }\n\n // Check whether the caller has asked to set params.\n if (update.setParams) {\n // Set every requested param.\n params = Object.keys(update.setParams)\n .reduce((params, param) => params.set(param, update.setParams ![param]), params);\n }\n\n // Finally, construct the new HttpRequest using the pieces from above.\n return new HttpRequest(\n method, url, body, {\n params, headers, reportProgress, responseType, withCredentials,\n });\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {HttpHeaders} from './headers';\n\n/**\n * Type enumeration for the different kinds of `HttpEvent`.\n *\n * @publicApi\n */\nexport enum HttpEventType {\n /**\n * The request was sent out over the wire.\n */\n Sent,\n\n /**\n * An upload progress event was received.\n */\n UploadProgress,\n\n /**\n * The response status code and headers were received.\n */\n ResponseHeader,\n\n /**\n * A download progress event was received.\n */\n DownloadProgress,\n\n /**\n * The full response including the body was received.\n */\n Response,\n\n /**\n * A custom event from an interceptor or a backend.\n */\n User,\n}\n\n/**\n * Base interface for progress events.\n *\n * @publicApi\n */\nexport interface HttpProgressEvent {\n /**\n * Progress event type is either upload or download.\n */\n type: HttpEventType.DownloadProgress|HttpEventType.UploadProgress;\n\n /**\n * Number of bytes uploaded or downloaded.\n */\n loaded: number;\n\n /**\n * Total number of bytes to upload or download. Depending on the request or\n * response, this may not be computable and thus may not be present.\n */\n total?: number;\n}\n\n/**\n * A download progress event.\n *\n * @publicApi\n */\nexport interface HttpDownloadProgressEvent extends HttpProgressEvent {\n type: HttpEventType.DownloadProgress;\n\n /**\n * The partial response body as downloaded so far.\n *\n * Only present if the responseType was `text`.\n */\n partialText?: string;\n}\n\n/**\n * An upload progress event.\n *\n * @publicApi\n */\nexport interface HttpUploadProgressEvent extends HttpProgressEvent {\n type: HttpEventType.UploadProgress;\n}\n\n/**\n * An event indicating that the request was sent to the server. Useful\n * when a request may be retried multiple times, to distinguish between\n * retries on the final event stream.\n *\n * @publicApi\n */\nexport interface HttpSentEvent { type: HttpEventType.Sent; }\n\n/**\n * A user-defined event.\n *\n * Grouping all custom events under this type ensures they will be handled\n * and forwarded by all implementations of interceptors.\n *\n * @publicApi\n */\nexport interface HttpUserEvent<T> { type: HttpEventType.User; }\n\n/**\n * An error that represents a failed attempt to JSON.parse text coming back\n * from the server.\n *\n * It bundles the Error object with the actual response body that failed to parse.\n *\n *\n */\nexport interface HttpJsonParseError {\n error: Error;\n text: string;\n}\n\n/**\n * Union type for all possible events on the response stream.\n *\n * Typed according to the expected type of the response.\n *\n * @publicApi\n */\nexport type HttpEvent<T> =\n HttpSentEvent | HttpHeaderResponse | HttpResponse<T>| HttpProgressEvent | HttpUserEvent<T>;\n\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * @publicApi\n */\nexport abstract class HttpResponseBase {\n /**\n * All response headers.\n */\n readonly headers: HttpHeaders;\n\n /**\n * Response status code.\n */\n readonly status: number;\n\n /**\n * Textual description of response status code.\n *\n * Do not depend on this.\n */\n readonly statusText: string;\n\n /**\n * URL of the resource retrieved, or null if not available.\n */\n readonly url: string|null;\n\n /**\n * Whether the status code falls in the 2xx range.\n */\n readonly ok: boolean;\n\n /**\n * Type of the response, narrowed to either the full response or the header.\n */\n // TODO(issue/24571): remove '!'.\n readonly type !: HttpEventType.Response | HttpEventType.ResponseHeader;\n\n /**\n * Super-constructor for all responses.\n *\n * The single parameter accepted is an initialization hash. Any properties\n * of the response passed there will override the default values.\n */\n constructor(\n init: {\n headers?: HttpHeaders,\n status?: number,\n statusText?: string,\n url?: string,\n },\n defaultStatus: number = 200, defaultStatusText: string = 'OK') {\n // If the hash has values passed, use them to initialize the response.\n // Otherwise use the default values.\n this.headers = init.headers || new HttpHeaders();\n this.status = init.status !== undefined ? init.status : defaultStatus;\n this.statusText = init.statusText || defaultStatusText;\n this.url = init.url || null;\n\n // Cache the ok value to avoid defining a getter.\n this.ok = this.status >= 200 && this.status < 300;\n }\n}\n\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * @publicApi\n */\nexport class HttpHeaderResponse extends HttpResponseBase {\n /**\n * Create a new `HttpHeaderResponse` with the given parameters.\n */\n constructor(init: {\n headers?: HttpHeaders,\n status?: number,\n statusText?: string,\n url?: string,\n } = {}) {\n super(init);\n }\n\n readonly type: HttpEventType.ResponseHeader = HttpEventType.ResponseHeader;\n\n /**\n * Copy this `HttpHeaderResponse`, overriding its contents with the\n * given parameter hash.\n */\n clone(update: {headers?: HttpHeaders; status?: number; statusText?: string; url?: string;} = {}):\n HttpHeaderResponse {\n // Perform a straightforward initialization of the new HttpHeaderResponse,\n // overriding the current parameters with new ones if given.\n return new HttpHeaderResponse({\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n }\n}\n\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * @publicApi\n */\nexport class HttpResponse<T> extends HttpResponseBase {\n /**\n * The response body, or `null` if one was not returned.\n */\n readonly body: T|null;\n\n /**\n * Construct a new `HttpResponse`.\n */\n constructor(init: {\n body?: T | null, headers?: HttpHeaders; status?: number; statusText?: string; url?: string;\n } = {}) {\n super(init);\n this.body = init.body !== undefined ? init.body : null;\n }\n\n readonly type: HttpEventType.Response = HttpEventType.Response;\n\n clone(): HttpResponse<T>;\n clone(update: {headers?: HttpHeaders; status?: number; statusText?: string; url?: string;}):\n HttpResponse<T>;\n clone<V>(update: {\n body?: V | null, headers?: HttpHeaders; status?: number; statusText?: string; url?: string;\n }): HttpResponse<V>;\n clone(update: {\n body?: any | null; headers?: HttpHeaders; status?: number; statusText?: string; url?: string;\n } = {}): HttpResponse<any> {\n return new HttpResponse<any>({\n body: (update.body !== undefined) ? update.body : this.body,\n headers: update.headers || this.headers,\n status: (update.status !== undefined) ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n }\n}\n\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * @publicApi\n */\nexport class HttpErrorResponse extends HttpResponseBase implements Error {\n readonly name = 'HttpErrorResponse';\n readonly message: string;\n readonly error: any|null;\n\n /**\n * Errors are never okay, even when the status code is in the 2xx success range.\n */\n readonly ok = false;\n\n constructor(init: {\n error?: any; headers?: HttpHeaders; status?: number; statusText?: string; url?: string;\n }) {\n // Initialize with a default status of 0 / Unknown Error.\n super(init, 0, 'Unknown Error');\n\n // If the response was successful, then this was a parse error. Otherwise, it was\n // a protocol-level failure of some sort. Either the request failed in transit\n // or the server returned an unsuccessful status code.\n if (this.status >= 200 && this.status < 300) {\n this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;\n } else {\n this.message =\n `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${init.statusText}`;\n }\n this.error = init.error || null;\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable} from '@angular/core';\nimport {Observable, of } from 'rxjs';\nimport {concatMap, filter, map} from 'rxjs/operators';\n\nimport {HttpHandler} from './backend';\nimport {HttpHeaders} from './headers';\nimport {HttpParams, HttpParamsOptions} from './params';\nimport {HttpRequest} from './request';\nimport {HttpEvent, HttpResponse} from './response';\n\n\n/**\n * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and\n * the given `body`. This function clones the object and adds the body.\n */\nfunction addBody<T>(\n options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams | {[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text',\n withCredentials?: boolean,\n },\n body: T | null): any {\n return {\n body,\n headers: options.headers,\n observe: options.observe,\n params: options.params,\n reportProgress: options.reportProgress,\n responseType: options.responseType,\n withCredentials: options.withCredentials,\n };\n}\n\nexport type HttpObserve = 'body' | 'events' | 'response';\n\n/**\n * Performs HTTP requests.\n *\n * `HttpClient` is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies based on\n * the signature that is called (mainly the values of `observe` and `responseType`).\n *\n *\n * @see [HTTP Guide](guide/http)\n *\n *\n * @usageNotes\n * Sample HTTP requests for the [Tour of Heroes](/tutorial/toh-pt0) application.\n *\n * ### HTTP Request Example\n *\n * ```\n * // GET heroes whose name contains search term\n * searchHeroes(term: string): observable<Hero[]>{\n *\n * const params = new HttpParams({fromString: 'name=term'});\n * return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});\n * }\n * ```\n * ### JSONP Example\n * ```\n * requestJsonp(url, callback = 'callback') {\n * return this.httpClient.jsonp(this.heroesURL, callback);\n * }\n * ```\n *\n *\n * ### PATCH Example\n * ```\n * // PATCH one of the heroes' name\n * patchHero (id: number, heroName: string): Observable<{}> {\n * const url = `${this.heroesUrl}/${id}`; // PATCH api/heroes/42\n * return this.httpClient.patch(url, {name: heroName}, httpOptions)\n * .pipe(catchError(this.handleError('patchHero')));\n * }\n* ```\n *\n * @publicApi\n */\n@Injectable()\nexport class HttpClient {\n constructor(private handler: HttpHandler) {}\n\n /**\n * Sends an `HTTPRequest` and returns a stream of `HTTPEvents`.\n *\n * @return An `Observable` of the response, with the response body as a stream of `HTTPEvents`.\n */\n request<R>(req: HttpRequest<any>): Observable<HttpEvent<R>>;\n\n /**\n * Constructs a request that interprets the body as an `ArrayBuffer` and returns the response in an\n * `ArrayBuffer`.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs a request that interprets the body as a blob and returns\n * the response as a blob.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type `Blob`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a request that interprets the body as a text string and\n * returns a string value.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type string.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a request that interprets the body as an `ArrayBuffer` and returns the\n * the full event stream.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as an array of `HTTPEvents` for the\n * request.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n params?: HttpParams|{[param: string]: string | string[]},\n observe: 'events', reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a request that interprets the body as a `Blob` and returns\n * the full event stream.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of of all `HttpEvents` for the request,\n * with the response body of type `Blob`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a request which interprets the body as a text string and returns the full event stream.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HttpEvents` for the reques,\n * with the response body of type string.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a request which interprets the body as a JSON object and returns the full event stream.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body of type `Object`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n reportProgress?: boolean,\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<any>>;\n\n /**\n * Constructs a request which interprets the body as a JSON object and returns the full event stream.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body of type `R`.\n */\n request<R>(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n reportProgress?: boolean,\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<R>>;\n\n /**\n * Constructs a request which interprets the body as an `ArrayBuffer`\n * and returns the full `HTTPResponse`.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body as an `ArrayBuffer`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a request which interprets the body as a `Blob` and returns the full `HTTPResponse`.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body of type `Blob`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a request which interprets the body as a text stream and returns the full `HTTPResponse`.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the HTTP response, with the response body of type string.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a request which interprets the body as a JSON object and returns the full `HTTPResponse`.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the full `HTTPResponse`,\n * with the response body of type `Object`.\n */\n request(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n reportProgress?: boolean,\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a request which interprets the body as a JSON object and returns\n * the full `HTTPResponse` with the response body in the requested type.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the full `HTTPResponse`, with the response body of type `R`.\n */\n request<R>(method: string, url: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n reportProgress?: boolean,\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<R>>;\n\n /**\n * Constructs a request which interprets the body as a JSON object and returns the full\n * `HTTPResponse` as a JSON object.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body of type `Object`.\n */\n request(method: string, url: string, options?: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n responseType?: 'json',\n reportProgress?: boolean,\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a request which interprets the body as a JSON object\n * with the response body of the requested type.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body of type `R`.\n */\n request<R>(method: string, url: string, options?: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n responseType?: 'json',\n reportProgress?: boolean,\n withCredentials?: boolean,\n }): Observable<R>;\n\n /**\n * Constructs a request where response type and requested observable are not known statically.\n *\n * @param method The HTTP method.\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the reuested response, wuth body of type `any`.\n */\n request(method: string, url: string, options?: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n params?: HttpParams|{[param: string]: string | string[]},\n observe?: HttpObserve,\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n }): Observable<any>;\n\n /**\n * Constructs an observable for a generic HTTP request that, when subscribed,\n * fires the request through the chain of registered interceptors and on to the\n * server.\n *\n * You can pass an `HttpRequest` directly as the only parameter. In this case,\n * the call returns an observable of the raw `HttpEvent` stream.\n *\n * Alternatively you can pass an HTTP method as the first parameter,\n * a URL string as the second, and an options hash containing the request body as the third.\n * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the\n * type of returned observable.\n * * The `responseType` value determines how a successful response body is parsed.\n * * If `responseType` is the default `json`, you can pass a type interface for the resulting\n * object as a type parameter to the call.\n *\n * The `observe` value determines the return type, according to what you are interested in\n * observing.\n * * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including\n * progress events by default.\n * * An `observe` value of response returns an observable of `HttpResponse<T>`,\n * where the `T` parameter depends on the `responseType` and any optionally provided type\n * parameter.\n * * An `observe` value of body returns an observable of `<T>` with the same `T` body type.\n *\n */\n request(first: string|HttpRequest<any>, url?: string, options: {\n body?: any,\n headers?: HttpHeaders|{[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n let req: HttpRequest<any>;\n // First, check whether the primary argument is an instance of `HttpRequest`.\n if (first instanceof HttpRequest) {\n // It is. The other arguments must be undefined (per the signatures) and can be\n // ignored.\n req = first as HttpRequest<any>;\n } else {\n // It's a string, so it represents a URL. Construct a request based on it,\n // and incorporate the remaining arguments (assuming `GET` unless a method is\n // provided.\n\n // Figure out the headers.\n let headers: HttpHeaders|undefined = undefined;\n if (options.headers instanceof HttpHeaders) {\n headers = options.headers;\n } else {\n headers = new HttpHeaders(options.headers);\n }\n\n // Sort out parameters.\n let params: HttpParams|undefined = undefined;\n if (!!options.params) {\n if (options.params instanceof HttpParams) {\n params = options.params;\n } else {\n params = new HttpParams({ fromObject: options.params } as HttpParamsOptions);\n }\n }\n\n // Construct the request.\n req = new HttpRequest(first, url !, (options.body !== undefined ? options.body : null), {\n headers,\n params,\n reportProgress: options.reportProgress,\n // By default, JSON is assumed to be returned for all calls.\n responseType: options.responseType || 'json',\n withCredentials: options.withCredentials,\n });\n }\n\n // Start with an Observable.of() the initial request, and run the handler (which\n // includes all interceptors) inside a concatMap(). This way, the handler runs\n // inside an Observable chain, which causes interceptors to be re-run on every\n // subscription (this also makes retries re-run the handler, including interceptors).\n const events$: Observable<HttpEvent<any>> =\n of (req).pipe(concatMap((req: HttpRequest<any>) => this.handler.handle(req)));\n\n // If coming via the API signature which accepts a previously constructed HttpRequest,\n // the only option is to get the event stream. Otherwise, return the event stream if\n // that is what was requested.\n if (first instanceof HttpRequest || options.observe === 'events') {\n return events$;\n }\n\n // The requested stream contains either the full response or the body. In either\n // case, the first step is to filter the event stream to extract a stream of\n // responses(s).\n const res$: Observable<HttpResponse<any>> = <Observable<HttpResponse<any>>>events$.pipe(\n filter((event: HttpEvent<any>) => event instanceof HttpResponse));\n\n // Decide which stream to return.\n switch (options.observe || 'body') {\n case 'body':\n // The requested stream is the body. Map the response stream to the response\n // body. This could be done more simply, but a misbehaving interceptor might\n // transform the response body into a different format and ignore the requested\n // responseType. Guard against this by validating that the response is of the\n // requested type.\n switch (req.responseType) {\n case 'arraybuffer':\n return res$.pipe(map((res: HttpResponse<any>) => {\n // Validate that the body is an ArrayBuffer.\n if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n throw new Error('Response is not an ArrayBuffer.');\n }\n return res.body;\n }));\n case 'blob':\n return res$.pipe(map((res: HttpResponse<any>) => {\n // Validate that the body is a Blob.\n if (res.body !== null && !(res.body instanceof Blob)) {\n throw new Error('Response is not a Blob.');\n }\n return res.body;\n }));\n case 'text':\n return res$.pipe(map((res: HttpResponse<any>) => {\n // Validate that the body is a string.\n if (res.body !== null && typeof res.body !== 'string') {\n throw new Error('Response is not a string.');\n }\n return res.body;\n }));\n case 'json':\n default:\n // No validation needed for JSON responses, as they can be of any type.\n return res$.pipe(map((res: HttpResponse<any>) => res.body));\n }\n case 'response':\n // The response stream was requested directly, so return it.\n return res$;\n default:\n // Guard against new future observe types being added.\n throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);\n }\n }\n\n /**\n * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer`\n * and returns the response as an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response body as an `ArrayBuffer`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n\n /**\n * Constructs a `DELETE` request that interprets the body as a `Blob` and returns\n * the response as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response body as a `Blob`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a text string and returns\n * a string.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type string.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer`\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HTTPEvents` for the request,\n * with response body as an `ArrayBuffer`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a `Blob`\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all the `HTTPEvents` for the request, with the response body as a\n * `Blob`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a text string\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HTTPEvents` for the request, with the response\n * body of type string.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a JSON object\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HTTPEvents` for the request, with response body of\n * type `Object`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs a `DELETE`request that interprets the body as a JSON object\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all the `HTTPEvents` for the request, with a response\n * body in the requested type.\n */\n delete<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer` and returns\n * the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the full `HTTPResponse`, with the response body as an `ArrayBuffer`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a `Blob` and returns the full\n * `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body of type `Blob`.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a text stream and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the full `HTTPResponse`, with the response body of type string.\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a `DELETE` request the interprets the body as a JSON object and returns\n * the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body of type `Object`.\n *\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a JSON object\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with the response body of the requested type.\n */\n delete<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs a `DELETE` request that interprets the body as a JSON object and\n * returns the response body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type `Object`.\n */\n delete (url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a DELETE request that interprets the body as a JSON object and returns\n * the response in a given type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with response body in the requested type.\n */\n delete<T>(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `DELETE` request to execute on the server. See the individual overloads for\n * details on the return type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n */\n delete (url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('DELETE', url, options as any);\n }\n\n\n /**\n * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns the response in\n * an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs a `GET` request that interprets the body as a `Blob`\n * and returns the response as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a `GET` request that interprets the body as a text string\n * and returns the response as a string value.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type string.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns\n * the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HttpEvents` for the request, with the response\n * body as an `ArrayBuffer`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a `Blob` and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a text string and returns\n * the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type string.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a JSON object\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type `Object`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a JSON object and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with a response body in the requested type.\n */\n get<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a `Blob` and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body as a `Blob`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a text stream and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body of type string.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a JSON object and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the full `HttpResponse`,\n * with the response body of type `Object`.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a JSON object and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the full `HTTPResponse` for the request,\n * with a response body in the requested type.\n */\n get<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs a `GET` request that interprets the body as a JSON object and\n * returns the response body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n *\n * @return An `Observable` of the response body as a JSON object.\n */\n get(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a `GET` request that interprets the body as a JSON object and returns\n * the response body in a given type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse`, with a response body in the requested type.\n */\n get<T>(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `GET` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n get(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('GET', url, options as any);\n }\n\n\n /**\n * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer` and\n * returns the response as an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a `Blob` and returns\n * the response as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a text string and returns the response\n * as a string value.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body of type string.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer`\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of tall `HttpEvents` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a `Blob` and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body as a `Blob`.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a text string\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all HttpEvents for the request, with the response body of type string.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a JSON object\n * and returns the full HTTP event stream.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of all `HTTPEvents` for the request, with a response body of\n * type `Object`.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a JSON object and\n * returns the full event stream.\n *\n * @return An `Observable` of all the `HTTPEvents` for the request\n * , with a response body in the requested type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n */\n head<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer`\n * and returns the full HTTP response.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a `Blob` and returns\n * the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body as a blob.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as text stream\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body of type string.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a JSON object and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body of type `Object`.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a JSON object\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with a responmse body of the requested type.\n */\n head<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a JSON object and\n * returns the response body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the response, with the response body as a JSON object.\n */\n head(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a `HEAD` request that interprets the body as a JSON object and returns\n * the response in a given type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with a response body of the given type.\n */\n head<T>(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `HEAD` request to execute on the server. The `HEAD` method returns\n * meta information about the resource without transferring the\n * resource itself. See the individual overloads for\n * details on the return type.\n */\n head(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('HEAD', url, options as any);\n }\n\n /**\n * Constructs a `JSONP` request for the given URL and name of the callback parameter.\n *\n * @param url The resource URL.\n * @param callbackParam The callback function name.\n *\n * @return An `Observable` of the response object, with response body as an object.\n */\n jsonp(url: string, callbackParam: string): Observable<Object>;\n\n /**\n * Constructs a `JSONP` request for the given URL and name of the callback parameter.\n *\n * @param url The resource URL.\n * @param callbackParam The callback function name.\n *\n * You must install a suitable interceptor, such as one provided by `HttpClientJsonpModule`.\n * If no such interceptor is reached,\n * then the `JSONP` request can be rejected by the configured backend.\n *\n * @return An `Observable` of the response object, with response body in the requested type.\n */\n jsonp<T>(url: string, callbackParam: string): Observable<T>;\n\n /**\n * Constructs an `Observable` that, when subscribed, causes a request with the special method\n * `JSONP` to be dispatched via the interceptor pipeline.\n * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain\n * API endpoints that don't support newer,\n * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.\n * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the\n * requests even if the API endpoint is not located on the same domain (origin) as the client-side\n * application making the request.\n * The endpoint API must support JSONP callback for JSONP requests to work.\n * The resource API returns the JSON response wrapped in a callback function.\n * You can pass the callback function name as one of the query parameters.\n * Note that JSONP requests can only be used with `GET` requests.\n *\n * @param url The resource URL.\n * @param callbackParam The callback function name.\n *\n */\n jsonp<T>(url: string, callbackParam: string): Observable<T> {\n return this.request<any>('JSONP', url, {\n params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n observe: 'body',\n responseType: 'json',\n });\n }\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as an\n * `ArrayBuffer` and returns the response as an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a `Blob` and returns\n * the response as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a text string and\n * returns a string value.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body of type string.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as an `ArrayBuffer`\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a `Blob` and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body as a `Blob`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a text string\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HTTPEvents` for the request,\n * with the response body of type string.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a JSON object\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HttpEvents` for the request with the response\n * body of type `Object`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a JSON object and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HttpEvents` for the request,\n * with a response body in the requested type.\n */\n options<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as an `ArrayBuffer`\n * and returns the full HTTP response.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a `Blob`\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with the response body as a `Blob`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as text stream\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with the response body of type string.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a JSON object\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with the response body of type `Object`.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a JSON object and\n * returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with a response body in the requested type.\n */\n options<T>(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a JSON object and returns the response\n * body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as a JSON object.\n */\n options(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs an `OPTIONS` request that interprets the body as a JSON object and returns the response\n * in a given type.\n *\n * @param url The endpoint URL.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HTTPResponse`, with a response body of the given type.\n */\n options<T>(url: string, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an `Observable` that, when subscribed, causes the configured\n * `OPTIONS` request to execute on the server. This method allows the client\n * to determine the supported HTTP methods and other capabilites of an endpoint,\n * without implying a resource action. See the individual overloads for\n * details on the return type.\n */\n options(url: string, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('OPTIONS', url, options as any);\n }\n\n /**\n * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer` and returns\n * the response as an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a `Blob` and returns the response\n * as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as as a text string and\n * returns the response as a string value.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with a response body of type string.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer` and\n * returns the the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HTTPevents` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a `Blob`\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HTTPevents` for the request, with the\n * response body as `Blob`.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a text string and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HTTPevents`for the request, with a\n * response body of type string.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a JSON object\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HTTPevents` for the request,\n * with a response body of type `Object`.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a JSON object\n * and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of all the `HTTPevents` for the request,\n * with a response body in the requested type.\n */\n patch<T>(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer`\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a `Blob` and returns the full\n * `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with the response body as a `Blob`.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a text stream and returns the\n * full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with a response body of type string.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a JSON object\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with a response body in the requested type.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a JSON object\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with a response body in the given type.\n */\n patch<T>(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a JSON object and\n * returns the response body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as a JSON object.\n */\n patch(url: string, body: any|null, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a `PATCH` request that interprets the body as a JSON object\n * and returns the response in a given type.\n *\n * @param url The endpoint URL.\n * @param body The resources to edit.\n * @param options HTTP options.\n *\n * @return An `Observable` of the `HttpResponse` for the request,\n * with a response body in the given type.\n */\n patch<T>(url: string, body: any|null, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PATCH` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n patch(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('PATCH', url, addBody(options, body));\n }\n\n /**\n * Constructs a `POST` request that interprets the body as an as an `ArrayBuffer` and returns\n * an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options.\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs a `POST` request that interprets the body as a `Blob` and returns the\n * response as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a `POST` request that interprets the body as a text string and\n * returns the response as a string value.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with a response body of type string.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a `POST` request that interprets the body as an `ArrayBuffer` and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a `Blob`\n * and returns the response in an observable of the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request, with the response body as `Blob`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a text string and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with a response body of type string.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a POST request that interprets the body as a JSON object and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with a response body of type `Object`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs a POST request that interprets the body as a JSON object and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with a response body in the requested type.\n */\n post<T>(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs a POST request that interprets the body as an `ArrayBuffer`\n * and returns the full `HTTPresponse`.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with the response body as an `ArrayBuffer`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a `Blob` and returns the full\n * `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body as a `Blob`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a text stream and returns\n * the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with a response body of type string.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a JSON object\n * and returns the full `HTTPResponse`.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with a response body of type\n * `Object`.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a JSON object and returns the full\n * `HTTPResponse`.\n *\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with a response body in the requested type.\n */\n post<T>(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs a `POST` request that interprets the body as a\n * JSON object and returns the response body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with the response body as a JSON object.\n */\n post(url: string, body: any|null, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a `POST` request that interprets the body as a JSON object\n * and returns an observable of the response.\n *\n * @param url The endpoint URL.\n * @param body The content to replace with.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with a response body in the requested type.\n */\n post<T>(url: string, body: any|null, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `POST` request to execute on the server. The server responds with the location of\n * the replaced resource. See the individual overloads for\n * details on the return type.\n */\n post(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('POST', url, addBody(options, body));\n }\n\n /**\n * Constructs a `PUT` request that interprets the body as an `ArrayBuffer` and returns the\n * response as an `ArrayBuffer`.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<ArrayBuffer>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a `Blob` and returns\n * the response as a `Blob`.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with the response body as a `Blob`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<Blob>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a text string and\n * returns the response as a string value.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with a response body of type string.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<string>;\n\n /**\n * Constructs a `PUT` request that interprets the body as an `ArrayBuffer` and\n * returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body as an `ArrayBuffer`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpEvent<ArrayBuffer>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a `Blob` and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with the response body as a `Blob`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpEvent<Blob>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a text string and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of all HttpEvents for the request, with a response body\n * of type string.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpEvent<string>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a JSON object and returns the full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request, with a response body of\n * type `Object`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpEvent<Object>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a JSON object and returns the\n * full event stream.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of all `HttpEvents` for the request,\n * with a response body in the requested type.\n */\n put<T>(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'events', responseType?: 'json', withCredentials?: boolean,\n }): Observable<HttpEvent<T>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as an\n * `ArrayBuffer` and returns an observable of the full HTTP response.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with the response body as an `ArrayBuffer`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'arraybuffer', withCredentials?: boolean,\n }): Observable<HttpResponse<ArrayBuffer>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a `Blob` and returns the\n * full HTTP response.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with the response body as a `Blob`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'blob', withCredentials?: boolean,\n }): Observable<HttpResponse<Blob>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a text stream and returns the\n * full HTTP response.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with a response body of type string.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType: 'text', withCredentials?: boolean,\n }): Observable<HttpResponse<string>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a JSON object and returns the full HTTP response.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with a response body\n * of type 'Object`.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<Object>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a JSON object and returns the full HTTP response.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request,\n * with a response body in the requested type.\n */\n put<T>(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe: 'response',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<HttpResponse<T>>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a JSON object and returns the response\n * body as a JSON object.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the response, with the response body as a JSON object.\n */\n put(url: string, body: any|null, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<Object>;\n\n /**\n * Constructs a `PUT` request that interprets the body as a JSON object\n * and returns an observable of the response.\n *\n * @param url The endpoint URL.\n * @param body The resources to add/update.\n * @param options HTTP options\n *\n * @return An `Observable` of the `HTTPResponse` for the request, with a response body in the requested type.\n */\n put<T>(url: string, body: any|null, options?: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: 'body',\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'json',\n withCredentials?: boolean,\n }): Observable<T>;\n\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PUT` request to execute on the server. The `PUT` method replaces an existing resource\n * with a new set of values.\n * See the individual overloads for details on the return type.\n */\n put(url: string, body: any|null, options: {\n headers?: HttpHeaders | {[header: string]: string | string[]},\n observe?: HttpObserve,\n params?: HttpParams|{[param: string]: string | string[]},\n reportProgress?: boolean,\n responseType?: 'arraybuffer'|'blob'|'json'|'text',\n withCredentials?: boolean,\n } = {}): Observable<any> {\n return this.request<any>('PUT', url, addBody(options, body));\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, InjectionToken} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport {HttpHandler} from './backend';\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\n\n/**\n * Intercepts `HttpRequest` or `HttpResponse` and handles them.\n *\n * Most interceptors transform the outgoing request before passing it to the\n * next interceptor in the chain, by calling `next.handle(transformedReq)`.\n * An interceptor may transform the\n * response event stream as well, by applying additional RxJS operators on the stream\n * returned by `next.handle()`.\n *\n * More rarely, an interceptor may handle the request entirely,\n * and compose a new event stream instead of invoking `next.handle()`. This is an\n * acceptable behavior, but keep in mind that further interceptors will be skipped entirely.\n *\n * It is also rare but valid for an interceptor to return multiple responses on the\n * event stream for a single request.\n *\n * @publicApi\n *\n * @see [HTTP Guide](guide/http#intercepting-requests-and-responses)\n *\n * @usageNotes\n *\n * To use the same instance of `HttpInterceptors` for the entire app, import the `HttpClientModule`\n * only in your `AppModule`, and add the interceptors to the root application injector .\n * If you import `HttpClientModule` multiple times across different modules (for example, in lazy\n * loading modules), each import creates a new copy of the `HttpClientModule`, which overwrites the interceptors\n * provided in the root module.\n *\n */\nexport interface HttpInterceptor {\n /**\n * * **req**: The outgoing request to handle\n * * **next**: The next interceptor in the chain, or the backend if no interceptors in the chain.\n *\n */\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;\n}\n\n/**\n * `HttpHandler` which applies an `HttpInterceptor` to an `HttpRequest`.\n *\n *\n */\nexport class HttpInterceptorHandler implements HttpHandler {\n constructor(private next: HttpHandler, private interceptor: HttpInterceptor) {}\n\n handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n return this.interceptor.intercept(req, this.next);\n }\n}\n\n/**\n * A multi-provider token which represents the array of `HttpInterceptor`s that\n * are registered.\n *\n * @publicApi\n */\nexport const HTTP_INTERCEPTORS = new InjectionToken<HttpInterceptor[]>('HTTP_INTERCEPTORS');\n\n@Injectable()\nexport class NoopInterceptor implements HttpInterceptor {\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n return next.handle(req);\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {Inject, Injectable} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpBackend, HttpHandler} from './backend';\nimport {HttpRequest} from './request';\nimport {HttpErrorResponse, HttpEvent, HttpEventType, HttpResponse} from './response';\n\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nlet nextRequestId: number = 0;\n\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nexport const JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nexport const JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nexport const JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n *\n */\nexport abstract class JsonpCallbackContext { [key: string]: (data: any) => void; }\n\n/**\n * `HttpBackend` that only processes `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n *\n * @publicApi\n */\n@Injectable()\nexport class JsonpClientBackend implements HttpBackend {\n constructor(private callbackMap: JsonpCallbackContext, @Inject(DOCUMENT) private document: any) {}\n\n /**\n * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n */\n private nextCallback(): string { return `ng_jsonp_callback_${nextRequestId++}`; }\n\n /**\n * Process a JSONP request and return an event stream of the results.\n */\n handle(req: HttpRequest<never>): Observable<HttpEvent<any>> {\n // Firstly, check both the method and response type. If either doesn't match\n // then the request was improperly routed here and cannot be handled.\n if (req.method !== 'JSONP') {\n throw new Error(JSONP_ERR_WRONG_METHOD);\n } else if (req.responseType !== 'json') {\n throw new Error(JSONP_ERR_WRONG_RESPONSE_TYPE);\n }\n\n // Everything else happens inside the Observable boundary.\n return new Observable<HttpEvent<any>>((observer: Observer<HttpEvent<any>>) => {\n // The first step to make a request is to generate the callback name, and replace the\n // callback placeholder in the URL with the name. Care has to be taken here to ensure\n // a trailing &, if matched, gets inserted back into the URL in the correct place.\n const callback = this.nextCallback();\n const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);\n\n // Construct the <script> tag and point it at the URL.\n const node = this.document.createElement('script');\n node.src = url;\n\n // A JSONP request requires waiting for multiple callbacks. These variables\n // are closed over and track state across those callbacks.\n\n // The response object, if one has been received, or null otherwise.\n let body: any|null = null;\n\n // Whether the response callback has been called.\n let finished: boolean = false;\n\n // Whether the request has been cancelled (and thus any other callbacks)\n // should be ignored.\n let cancelled: boolean = false;\n\n // Set the response callback in this.callbackMap (which will be the window\n // object in the browser. The script being loaded via the <script> tag will\n // eventually call this callback.\n this.callbackMap[callback] = (data?: any) => {\n // Data has been received from the JSONP script. Firstly, delete this callback.\n delete this.callbackMap[callback];\n\n // Next, make sure the request wasn't cancelled in the meantime.\n if (cancelled) {\n return;\n }\n\n // Set state to indicate data was received.\n body = data;\n finished = true;\n };\n\n // cleanup() is a utility closure that removes the <script> from the page and\n // the response callback from the window. This logic is used in both the\n // success, error, and cancellation paths, so it's extracted out for convenience.\n const cleanup = () => {\n // Remove the <script> tag if it's still on the page.\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n\n // Remove the response callback from the callbackMap (window object in the\n // browser).\n delete this.callbackMap[callback];\n };\n\n // onLoad() is the success callback which runs after the response callback\n // if the JSONP script loads successfully. The event itself is unimportant.\n // If something went wrong, onLoad() may run without the response callback\n // having been invoked.\n const onLoad = (event: Event) => {\n // Do nothing if the request has been cancelled.\n if (cancelled) {\n return;\n }\n\n // Cleanup the page.\n cleanup();\n\n // Check whether the response callback has run.\n if (!finished) {\n // It hasn't, something went wrong with the request. Return an error via\n // the Observable error path. All JSONP errors have status 0.\n observer.error(new HttpErrorResponse({\n url,\n status: 0,\n statusText: 'JSONP Error',\n error: new Error(JSONP_ERR_NO_CALLBACK),\n }));\n return;\n }\n\n // Success. body either contains the response body or null if none was\n // returned.\n observer.next(new HttpResponse({\n body,\n status: 200,\n statusText: 'OK', url,\n }));\n\n // Complete the stream, the response is over.\n observer.complete();\n };\n\n // onError() is the error callback, which runs if the script returned generates\n // a Javascript error. It emits the error via the Observable error channel as\n // a HttpErrorResponse.\n const onError: any = (error: Error) => {\n // If the request was already cancelled, no need to emit anything.\n if (cancelled) {\n return;\n }\n cleanup();\n\n // Wrap the error in a HttpErrorResponse.\n observer.error(new HttpErrorResponse({\n error,\n status: 0,\n statusText: 'JSONP Error', url,\n }));\n };\n\n // Subscribe to both the success (load) and error events on the <script> tag,\n // and add it to the page.\n node.addEventListener('load', onLoad);\n node.addEventListener('error', onError);\n this.document.body.appendChild(node);\n\n // The request has now been successfully sent.\n observer.next({type: HttpEventType.Sent});\n\n // Cancellation handler.\n return () => {\n // Track the cancellation so event listeners won't do anything even if already scheduled.\n cancelled = true;\n\n // Remove the event listeners so they won't run if the events later fire.\n node.removeEventListener('load', onLoad);\n node.removeEventListener('error', onError);\n\n // And finally, clean up the page.\n cleanup();\n };\n });\n }\n}\n\n/**\n * An `HttpInterceptor` which identifies requests with the method JSONP and\n * shifts them to the `JsonpClientBackend`.\n *\n * @publicApi\n */\n@Injectable()\nexport class JsonpInterceptor {\n constructor(private jsonp: JsonpClientBackend) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (req.method === 'JSONP') {\n return this.jsonp.handle(req as HttpRequest<never>);\n }\n // Fall through for normal HTTP requests.\n return next.handle(req);\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpBackend} from './backend';\nimport {HttpHeaders} from './headers';\nimport {HttpRequest} from './request';\nimport {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaderResponse, HttpJsonParseError, HttpResponse, HttpUploadProgressEvent} from './response';\n\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n\n/**\n * Determine an appropriate URL for the response, by checking either\n * XMLHttpRequest.responseURL or the X-Request-URL header.\n */\nfunction getResponseUrl(xhr: any): string|null {\n if ('responseURL' in xhr && xhr.responseURL) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n return null;\n}\n\n/**\n * A wrapper around the `XMLHttpRequest` constructor.\n *\n * @publicApi\n */\nexport abstract class XhrFactory { abstract build(): XMLHttpRequest; }\n\n/**\n * A factory for @{link HttpXhrBackend} that uses the `XMLHttpRequest` browser API.\n *\n *\n */\n@Injectable()\nexport class BrowserXhr implements XhrFactory {\n constructor() {}\n build(): any { return <any>(new XMLHttpRequest()); }\n}\n\n/**\n * Tracks a response from the server that does not yet have a body.\n */\ninterface PartialResponse {\n headers: HttpHeaders;\n status: number;\n statusText: string;\n url: string;\n}\n\n/**\n * An `HttpBackend` which uses the XMLHttpRequest API to send\n * requests to a backend server.\n *\n * @publicApi\n */\n@Injectable()\nexport class HttpXhrBackend implements HttpBackend {\n constructor(private xhrFactory: XhrFactory) {}\n\n /**\n * Process a request and return a stream of response events.\n */\n handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n // Quick check to give a better error message when a user attempts to use\n // HttpClient.jsonp() without installing the JsonpClientModule\n if (req.method === 'JSONP') {\n throw new Error(`Attempted to construct Jsonp request without JsonpClientModule installed.`);\n }\n\n // Everything happens on Observable subscription.\n return new Observable((observer: Observer<HttpEvent<any>>) => {\n // Start by setting up the XHR object with request method, URL, and withCredentials flag.\n const xhr = this.xhrFactory.build();\n xhr.open(req.method, req.urlWithParams);\n if (!!req.withCredentials) {\n xhr.withCredentials = true;\n }\n\n // Add all the requested headers.\n req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));\n\n // Add an Accept header if one isn't present already.\n if (!req.headers.has('Accept')) {\n xhr.setRequestHeader('Accept', 'application/json, text/plain, */*');\n }\n\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has('Content-Type')) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n xhr.setRequestHeader('Content-Type', detectedType);\n }\n }\n\n // Set the responseType if one was requested.\n if (req.responseType) {\n const responseType = req.responseType.toLowerCase();\n\n // JSON responses need to be processed as text. This is because if the server\n // returns an XSSI-prefixed JSON response, the browser will fail to parse it,\n // xhr.response will be null, and xhr.responseText cannot be accessed to\n // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON\n // is parsed by first requesting text and then applying JSON.parse.\n xhr.responseType = ((responseType !== 'json') ? responseType : 'text') as any;\n }\n\n // Serialize the request body if one is present. If not, this will be set to null.\n const reqBody = req.serializeBody();\n\n // If progress events are enabled, response headers will be delivered\n // in two events - the HttpHeaderResponse event and the full HttpResponse\n // event. However, since response headers don't change in between these\n // two events, it doesn't make sense to parse them twice. So headerResponse\n // caches the data extracted from the response whenever it's first parsed,\n // to ensure parsing isn't duplicated.\n let headerResponse: HttpHeaderResponse|null = null;\n\n // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest\n // state, and memoizes it into headerResponse.\n const partialFromXhr = (): HttpHeaderResponse => {\n if (headerResponse !== null) {\n return headerResponse;\n }\n\n // Read status and normalize an IE9 bug (http://bugs.jquery.com/ticket/1450).\n const status: number = xhr.status === 1223 ? 204 : xhr.status;\n const statusText = xhr.statusText || 'OK';\n\n // Parse headers from XMLHttpRequest - this step is lazy.\n const headers = new HttpHeaders(xhr.getAllResponseHeaders());\n\n // Read the response URL from the XMLHttpResponse instance and fall back on the\n // request URL.\n const url = getResponseUrl(xhr) || req.url;\n\n // Construct the HttpHeaderResponse and memoize it.\n headerResponse = new HttpHeaderResponse({headers, status, statusText, url});\n return headerResponse;\n };\n\n // Next, a few closures are defined for the various events which XMLHttpRequest can\n // emit. This allows them to be unregistered as event listeners later.\n\n // First up is the load event, which represents a response being fully available.\n const onLoad = () => {\n // Read response state from the memoized partial data.\n let {headers, status, statusText, url} = partialFromXhr();\n\n // The body will be read out if present.\n let body: any|null = null;\n\n if (status !== 204) {\n // Use XMLHttpRequest.response if set, responseText otherwise.\n body = (typeof xhr.response === 'undefined') ? xhr.responseText : xhr.response;\n }\n\n // Normalize another potential bug (this one comes from CORS).\n if (status === 0) {\n status = !!body ? 200 : 0;\n }\n\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n let ok = status >= 200 && status < 300;\n\n // Check whether the body needs to be parsed as JSON (in many cases the browser\n // will have done that already).\n if (req.responseType === 'json' && typeof body === 'string') {\n // Save the original body, before attempting XSSI prefix stripping.\n const originalBody = body;\n body = body.replace(XSSI_PREFIX, '');\n try {\n // Attempt the parse. If it fails, a parse error should be delivered to the user.\n body = body !== '' ? JSON.parse(body) : null;\n } catch (error) {\n // Since the JSON.parse failed, it's reasonable to assume this might not have been a\n // JSON response. Restore the original body (including any XSSI prefix) to deliver\n // a better error response.\n body = originalBody;\n\n // If this was an error request to begin with, leave it as a string, it probably\n // just isn't JSON. Otherwise, deliver the parsing error to the user.\n if (ok) {\n // Even though the response status was 2xx, this is still an error.\n ok = false;\n // The parse error contains the text of the body that failed to parse.\n body = { error, text: body } as HttpJsonParseError;\n }\n }\n }\n\n if (ok) {\n // A successful response is delivered on the event stream.\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url: url || undefined,\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n } else {\n // An unsuccessful request is delivered on the error channel.\n observer.error(new HttpErrorResponse({\n // The error in this case is the response body (error from the server).\n error: body,\n headers,\n status,\n statusText,\n url: url || undefined,\n }));\n }\n };\n\n // The onError callback is called when something goes wrong at the network level.\n // Connection timeout, DNS error, offline, etc. These are actual errors, and are\n // transmitted on the error channel.\n const onError = (error: ErrorEvent) => {\n const {url} = partialFromXhr();\n const res = new HttpErrorResponse({\n error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n url: url || undefined,\n });\n observer.error(res);\n };\n\n // The sentHeaders flag tracks whether the HttpResponseHeaders event\n // has been sent on the stream. This is necessary to track if progress\n // is enabled since the event will be sent on only the first download\n // progerss event.\n let sentHeaders = false;\n\n // The download progress event handler, which is only registered if\n // progress events are enabled.\n const onDownProgress = (event: ProgressEvent) => {\n // Send the HttpResponseHeaders event if it hasn't been sent already.\n if (!sentHeaders) {\n observer.next(partialFromXhr());\n sentHeaders = true;\n }\n\n // Start building the download progress event to deliver on the response\n // event stream.\n let progressEvent: HttpDownloadProgressEvent = {\n type: HttpEventType.DownloadProgress,\n loaded: event.loaded,\n };\n\n // Set the total number of bytes in the event if it's available.\n if (event.lengthComputable) {\n progressEvent.total = event.total;\n }\n\n // If the request was for text content and a partial response is\n // available on XMLHttpRequest, include it in the progress event\n // to allow for streaming reads.\n if (req.responseType === 'text' && !!xhr.responseText) {\n progressEvent.partialText = xhr.responseText;\n }\n\n // Finally, fire the event.\n observer.next(progressEvent);\n };\n\n // The upload progress event handler, which is only registered if\n // progress events are enabled.\n const onUpProgress = (event: ProgressEvent) => {\n // Upload progress events are simpler. Begin building the progress\n // event.\n let progress: HttpUploadProgressEvent = {\n type: HttpEventType.UploadProgress,\n loaded: event.loaded,\n };\n\n // If the total number of bytes being uploaded is available, include\n // it.\n if (event.lengthComputable) {\n progress.total = event.total;\n }\n\n // Send the event.\n observer.next(progress);\n };\n\n // By default, register for load and error events.\n xhr.addEventListener('load', onLoad);\n xhr.addEventListener('error', onError);\n\n // Progress events are only enabled if requested.\n if (req.reportProgress) {\n // Download progress is always enabled if requested.\n xhr.addEventListener('progress', onDownProgress);\n\n // Upload progress depends on whether there is a body to upload.\n if (reqBody !== null && xhr.upload) {\n xhr.upload.addEventListener('progress', onUpProgress);\n }\n }\n\n // Fire the request, and notify the event stream that it was fired.\n xhr.send(reqBody !);\n observer.next({type: HttpEventType.Sent});\n\n // This is the return from the Observable function, which is the\n // request cancellation handler.\n return () => {\n // On a cancellation, remove all registered event listeners.\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('load', onLoad);\n if (req.reportProgress) {\n xhr.removeEventListener('progress', onDownProgress);\n if (reqBody !== null && xhr.upload) {\n xhr.upload.removeEventListener('progress', onUpProgress);\n }\n }\n\n // Finally, abort the in-flight request.\n xhr.abort();\n };\n });\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {DOCUMENT, ɵparseCookieValue as parseCookieValue} from '@angular/common';\nimport {Inject, Injectable, InjectionToken, PLATFORM_ID} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport {HttpHandler} from './backend';\nimport {HttpInterceptor} from './interceptor';\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\n\nexport const XSRF_COOKIE_NAME = new InjectionToken<string>('XSRF_COOKIE_NAME');\nexport const XSRF_HEADER_NAME = new InjectionToken<string>('XSRF_HEADER_NAME');\n\n/**\n * Retrieves the current XSRF token to use with the next outgoing request.\n *\n * @publicApi\n */\nexport abstract class HttpXsrfTokenExtractor {\n /**\n * Get the XSRF token to use with an outgoing request.\n *\n * Will be called for every request, so the token may change between requests.\n */\n abstract getToken(): string|null;\n}\n\n/**\n * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.\n */\n@Injectable()\nexport class HttpXsrfCookieExtractor implements HttpXsrfTokenExtractor {\n private lastCookieString: string = '';\n private lastToken: string|null = null;\n\n /**\n * @internal for testing\n */\n parseCount: number = 0;\n\n constructor(\n @Inject(DOCUMENT) private doc: any, @Inject(PLATFORM_ID) private platform: string,\n @Inject(XSRF_COOKIE_NAME) private cookieName: string) {}\n\n getToken(): string|null {\n if (this.platform === 'server') {\n return null;\n }\n const cookieString = this.doc.cookie || '';\n if (cookieString !== this.lastCookieString) {\n this.parseCount++;\n this.lastToken = parseCookieValue(cookieString, this.cookieName);\n this.lastCookieString = cookieString;\n }\n return this.lastToken;\n }\n}\n\n/**\n * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.\n */\n@Injectable()\nexport class HttpXsrfInterceptor implements HttpInterceptor {\n constructor(\n private tokenService: HttpXsrfTokenExtractor,\n @Inject(XSRF_HEADER_NAME) private headerName: string) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const lcUrl = req.url.toLowerCase();\n // Skip both non-mutating requests and absolute URLs.\n // Non-mutating requests don't require a token, and absolute URLs require special handling\n // anyway as the cookie set\n // on our origin is not the same as the token expected by another origin.\n if (req.method === 'GET' || req.method === 'HEAD' || lcUrl.startsWith('http://') ||\n lcUrl.startsWith('https://')) {\n return next.handle(req);\n }\n const token = this.tokenService.getToken();\n\n // Be careful not to overwrite an existing header of the same name.\n if (token !== null && !req.headers.has(this.headerName)) {\n req = req.clone({headers: req.headers.set(this.headerName, token)});\n }\n return next.handle(req);\n }\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Injectable, Injector, ModuleWithProviders, NgModule} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport {HttpBackend, HttpHandler} from './backend';\nimport {HttpClient} from './client';\nimport {HTTP_INTERCEPTORS, HttpInterceptor, HttpInterceptorHandler, NoopInterceptor} from './interceptor';\nimport {JsonpCallbackContext, JsonpClientBackend, JsonpInterceptor} from './jsonp';\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\nimport {BrowserXhr, HttpXhrBackend, XhrFactory} from './xhr';\nimport {HttpXsrfCookieExtractor, HttpXsrfInterceptor, HttpXsrfTokenExtractor, XSRF_COOKIE_NAME, XSRF_HEADER_NAME} from './xsrf';\n\n/**\n * An injectable `HttpHandler` that applies multiple interceptors\n * to a request before passing it to the given `HttpBackend`.\n *\n * The interceptors are loaded lazily from the injector, to allow\n * interceptors to themselves inject classes depending indirectly\n * on `HttpInterceptingHandler` itself.\n * @see `HttpInterceptor`\n */\n@Injectable()\nexport class HttpInterceptingHandler implements HttpHandler {\n private chain: HttpHandler|null = null;\n\n constructor(private backend: HttpBackend, private injector: Injector) {}\n\n handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n if (this.chain === null) {\n const interceptors = this.injector.get(HTTP_INTERCEPTORS, []);\n this.chain = interceptors.reduceRight(\n (next, interceptor) => new HttpInterceptorHandler(next, interceptor), this.backend);\n }\n return this.chain.handle(req);\n }\n}\n\n/**\n * Constructs an `HttpHandler` that applies interceptors\n * to a request before passing it to the given `HttpBackend`.\n *\n * Use as a factory function within `HttpClientModule`.\n *\n *\n */\nexport function interceptingHandler(\n backend: HttpBackend, interceptors: HttpInterceptor[] | null = []): HttpHandler {\n if (!interceptors) {\n return backend;\n }\n return interceptors.reduceRight(\n (next, interceptor) => new HttpInterceptorHandler(next, interceptor), backend);\n}\n\n/**\n * Factory function that determines where to store JSONP callbacks.\n *\n * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist\n * in test environments. In that case, callbacks are stored on an anonymous object instead.\n *\n *\n */\nexport function jsonpCallbackContext(): Object {\n if (typeof window === 'object') {\n return window;\n }\n return {};\n}\n\n/**\n * Configures XSRF protection support for outgoing requests.\n *\n * For a server that supports a cookie-based XSRF protection system,\n * use directly to configure XSRF protection with the correct\n * cookie and header names.\n *\n * If no names are supplied, the default cookie name is `XSRF-TOKEN`\n * and the default header name is `X-XSRF-TOKEN`.\n *\n * @publicApi\n */\n@NgModule({\n providers: [\n HttpXsrfInterceptor,\n {provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true},\n {provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor},\n {provide: XSRF_COOKIE_NAME, useValue: 'XSRF-TOKEN'},\n {provide: XSRF_HEADER_NAME, useValue: 'X-XSRF-TOKEN'},\n ],\n})\nexport class HttpClientXsrfModule {\n /**\n * Disable the default XSRF protection.\n */\n static disable(): ModuleWithProviders<HttpClientXsrfModule> {\n return {\n ngModule: HttpClientXsrfModule,\n providers: [\n {provide: HttpXsrfInterceptor, useClass: NoopInterceptor},\n ],\n };\n }\n\n /**\n * Configure XSRF protection.\n * @param options An object that can specify either or both\n * cookie name or header name.\n * - Cookie name default is `XSRF-TOKEN`.\n * - Header name default is `X-XSRF-TOKEN`.\n *\n */\n static withOptions(options: {\n cookieName?: string,\n headerName?: string,\n } = {}): ModuleWithProviders<HttpClientXsrfModule> {\n return {\n ngModule: HttpClientXsrfModule,\n providers: [\n options.cookieName ? {provide: XSRF_COOKIE_NAME, useValue: options.cookieName} : [],\n options.headerName ? {provide: XSRF_HEADER_NAME, useValue: options.headerName} : [],\n ],\n };\n }\n}\n\n/**\n * Configures the [dependency injector](guide/glossary#injector) for `HttpClient`\n * with supporting services for XSRF. Automatically imported by `HttpClientModule`.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in [DI token](guide/glossary#di-token) `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n */\n@NgModule({\n /**\n * Optional configuration for XSRF protection.\n */\n imports: [\n HttpClientXsrfModule.withOptions({\n cookieName: 'XSRF-TOKEN',\n headerName: 'X-XSRF-TOKEN',\n }),\n ],\n /**\n * Configures the [dependency injector](guide/glossary#injector) where it is imported\n * with supporting services for HTTP communications.\n */\n providers: [\n HttpClient,\n {provide: HttpHandler, useClass: HttpInterceptingHandler},\n HttpXhrBackend,\n {provide: HttpBackend, useExisting: HttpXhrBackend},\n BrowserXhr,\n {provide: XhrFactory, useExisting: BrowserXhr},\n ],\n})\nexport class HttpClientModule {\n}\n\n/**\n * Configures the [dependency injector](guide/glossary#injector) for `HttpClient`\n * with supporting services for JSONP.\n * Without this module, Jsonp requests reach the backend\n * with method JSONP, where they are rejected.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in [DI token](guide/glossary#di-token) `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n */\n@NgModule({\n providers: [\n JsonpClientBackend,\n {provide: JsonpCallbackContext, useFactory: jsonpCallbackContext},\n {provide: HTTP_INTERCEPTORS, useClass: JsonpInterceptor, multi: true},\n ],\n})\nexport class HttpClientJsonpModule {\n}\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport {HttpBackend, HttpHandler} from './src/backend';\nexport {HttpClient} from './src/client';\nexport {HttpHeaders} from './src/headers';\nexport {HTTP_INTERCEPTORS, HttpInterceptor} from './src/interceptor';\nexport {JsonpClientBackend, JsonpInterceptor} from './src/jsonp';\nexport {HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpInterceptingHandler as ɵHttpInterceptingHandler} from './src/module';\nexport {HttpParameterCodec, HttpParams, HttpUrlEncodingCodec} from './src/params';\nexport {HttpRequest} from './src/request';\nexport {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaderResponse, HttpProgressEvent, HttpResponse, HttpResponseBase, HttpSentEvent, HttpUploadProgressEvent, HttpUserEvent} from './src/response';\nexport {HttpXhrBackend, XhrFactory} from './src/xhr';\nexport {HttpXsrfTokenExtractor} from './src/xsrf';\n","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// This file is not used to build this module. It is only used during editing\n// by the TypeScript language service and during build for verification. `ngc`\n// replaces this file with production index.ts when it rewrites private symbol\n// names.\n\nexport * from './public_api';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NoopInterceptor as ɵangular_packages_common_http_http_a} from './src/interceptor';\nexport {JsonpCallbackContext as ɵangular_packages_common_http_http_b} from './src/jsonp';\nexport {jsonpCallbackContext as ɵangular_packages_common_http_http_c} from './src/module';\nexport {BrowserXhr as ɵangular_packages_common_http_http_d} from './src/xhr';\nexport {HttpXsrfCookieExtractor as ɵangular_packages_common_http_http_g,HttpXsrfInterceptor as ɵangular_packages_common_http_http_h,XSRF_COOKIE_NAME as ɵangular_packages_common_http_http_e,XSRF_HEADER_NAME as ɵangular_packages_common_http_http_f} from './src/xsrf';"],"names":["tslib_1.__extends","tslib_1.__param","parseCookieValue"],"mappings":"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"}