angular-cn/modules/@angular/http/src/headers.ts

171 lines
4.9 KiB
TypeScript
Raw Normal View History

/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
2016-09-19 20:15:57 -04:00
import {ListWrapper, MapWrapper, StringMapWrapper, isListLikeIterable, iterateListLike} from '../src/facade/collection';
/**
* Polyfill for [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers/Headers), as
2015-09-17 18:36:38 -04:00
* specified in the [Fetch Spec](https://fetch.spec.whatwg.org/#headers-class).
*
* The only known difference between this `Headers` implementation and the spec is the
* lack of an `entries` method.
*
* ### Example ([live demo](http://plnkr.co/edit/MTdwT6?p=preview))
*
* ```
* import {Headers} from '@angular/http';
2015-09-17 18:36:38 -04:00
*
* var firstHeaders = new Headers();
* firstHeaders.append('Content-Type', 'image/jpeg');
* console.log(firstHeaders.get('Content-Type')) //'image/jpeg'
*
* // Create headers from Plain Old JavaScript Object
* var secondHeaders = new Headers({
* 'X-My-Custom-Header': 'Angular'
* });
* console.log(secondHeaders.get('X-My-Custom-Header')); //'Angular'
*
* var thirdHeaders = new Headers(secondHeaders);
* console.log(thirdHeaders.get('X-My-Custom-Header')); //'Angular'
* ```
*
* @experimental
*/
export class Headers {
/** @internal */
_headersMap: Map<string, string[]>;
constructor(headers?: Headers|{[key: string]: any}) {
if (headers instanceof Headers) {
this._headersMap = new Map<string, string[]>((<Headers>headers)._headersMap);
return;
}
this._headersMap = new Map<string, string[]>();
if (!headers) {
return;
}
// headers instanceof StringMap
2016-02-01 20:05:50 -05:00
StringMapWrapper.forEach(headers, (v: any, k: string) => {
this._headersMap.set(normalize(k), isListLikeIterable(v) ? v : [v]);
2016-02-01 20:05:50 -05:00
});
}
/**
* Returns a new Headers instance from the given DOMString of Response Headers
*/
static fromResponseHeaderString(headersString: string): Headers {
let headers = new Headers();
headersString.split('\n').forEach(line => {
const index = line.indexOf(':');
if (index > 0) {
const key = line.substring(0, index);
const value = line.substring(index + 1).trim();
headers.set(key, value);
}
});
return headers;
}
/**
* Appends a header to existing list of header values for a given header name.
*/
append(name: string, value: string): void {
name = normalize(name);
var mapName = this._headersMap.get(name);
var list = isListLikeIterable(mapName) ? mapName : [];
list.push(value);
this._headersMap.set(name, list);
}
/**
* Deletes all header values for the given name.
*/
delete (name: string): void { this._headersMap.delete(normalize(name)); }
forEach(fn: (values: string[], name: string, headers: Map<string, string[]>) => void): void {
this._headersMap.forEach(fn);
2015-09-17 18:36:38 -04:00
}
/**
* Returns first header that matches given name.
*/
get(header: string): string { return ListWrapper.first(this._headersMap.get(normalize(header))); }
/**
* Check for existence of header by given name.
*/
has(header: string): boolean { return this._headersMap.has(normalize(header)); }
/**
* Provides names of set headers
*/
keys(): string[] { return MapWrapper.keys(this._headersMap); }
/**
* Sets or overrides header value for given name.
*/
set(header: string, value: string|string[]): void {
2016-02-01 20:05:50 -05:00
var list: string[] = [];
if (isListLikeIterable(value)) {
var pushValue = (<string[]>value).join(',');
list.push(pushValue);
} else {
2016-02-01 20:05:50 -05:00
list.push(<string>value);
}
this._headersMap.set(normalize(header), list);
}
/**
* Returns values of all headers.
*/
values(): string[][] { return MapWrapper.values(this._headersMap); }
2015-12-09 23:56:32 -05:00
/**
* Returns string of all headers.
*/
toJSON(): {[key: string]: any} {
let serializableHeaders = {};
this._headersMap.forEach((values: string[], name: string) => {
let list: any[] /** TODO #9100 */ = [];
iterateListLike(
values, (val: any /** TODO #9100 */) => list = ListWrapper.concat(list, val.split(',')));
(serializableHeaders as any /** TODO #9100 */)[normalize(name)] = list;
});
return serializableHeaders;
}
2015-12-09 23:56:32 -05:00
/**
* Returns list of header values for a given name.
*/
getAll(header: string): string[] {
var headers = this._headersMap.get(normalize(header));
return isListLikeIterable(headers) ? headers : [];
}
/**
* This method is not implemented.
*/
entries() { throw new Error('"entries" method is not implemented on Headers class'); }
}
// "HTTP character sets are identified by case-insensitive tokens"
// Spec at https://tools.ietf.org/html/rfc2616
// This implementation is same as NodeJS.
// see https://nodejs.org/dist/latest-v6.x/docs/api/http.html#http_message_headers
function normalize(name: string): string {
return name.toLowerCase();
}