From 480547955cb9c0cf398cbc0b9a31840e271dc028 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Thu, 27 Jul 2017 09:35:44 -0700 Subject: [PATCH] Drop Headers class in favor of a Map object This patch removes Header class and substitutes it with a simple Map object. The map is chosen over the vanilla object since it has explicit order of headers which we'd like to preserve. References #106. --- docs/api.md | 61 +++-------------------------- lib/NetworkManager.js | 91 ++----------------------------------------- 2 files changed, 8 insertions(+), 144 deletions(-) diff --git a/docs/api.md b/docs/api.md index 304e782bed6..1babe7a32b9 100644 --- a/docs/api.md +++ b/docs/api.md @@ -111,15 +111,6 @@ + [interceptedRequest.method](#interceptedrequestmethod) + [interceptedRequest.postData](#interceptedrequestpostdata) + [interceptedRequest.url](#interceptedrequesturl) - * [class: Headers](#class-headers) - + [headers.append(name, value)](#headersappendname-value) - + [headers.delete(name)](#headersdeletename) - + [headers.entries()](#headersentries) - + [headers.get(name)](#headersgetname) - + [headers.has(name)](#headershasname) - + [headers.keys()](#headerskeys) - + [headers.set(name, value)](#headerssetname-value) - + [headers.values()](#headersvalues) * [class: Body](#class-body) + [body.arrayBuffer()](#bodyarraybuffer) + [body.bodyUsed](#bodybodyused) @@ -935,9 +926,7 @@ If request gets a 'redirect' response, the request is successfully finished with [Request] class represents requests which are sent by page. [Request] implements [Body] mixin, which in case of HTTP POST requests allows clients to call `request.json()` or `request.text()` to get different representations of request's body. #### request.headers -- <[Headers]> - -Contains the associated [Headers] object of the request. +- <[Map]> A map of HTTP headers associated with the request. #### request.method - <[string]> @@ -958,9 +947,7 @@ Contains the URL of the request. [Response] class represents responses which are received by page. [Response] implements [Body] mixin, which allows clients to call `response.json()` or `response.text()` to get different representations of response body. #### response.headers -- <[Headers]> - -Contains the [Headers] object associated with the response. +- <[Map]> A map of HTTP headers associated with the response. #### response.ok - <[boolean]> @@ -1002,12 +989,9 @@ Aborts request. Continues request. #### interceptedRequest.headers -- <[Headers]> +- <[Map]> A map of HTTP headers associated with the request. -Contains the [Headers] object associated with the request. - -Headers could be mutated with the `headers.append`, `headers.set` and other -methods. Must not be changed in response to an authChallenge. +Headers could be mutated. Must not be changed in response to an authChallenge. #### interceptedRequest.method - <[string]> @@ -1028,41 +1012,6 @@ Contains `POST` data for `POST` requests. If changed, the request url will be modified in a way that's not observable by page. Must not be changed in response to an authChallenge. -### class: Headers -#### headers.append(name, value) -- `name` <[string]> Case-insensetive header name. -- `value` <[string]> Header value - -If there's already a header with name `name`, the header gets overwritten. - -#### headers.delete(name) -- `name` <[string]> Case-insensetive name of the header to be deleted. If there's no header with such name, the method does nothing. - -#### headers.entries() -- returns: <[iterator]> An iterator allowing to go through all key/value pairs contained in this object. Both the key and value of each pairs are [string] objects. - - -#### headers.get(name) -- `name` <[string]> Case-insensetive name of the header. -- returns: <[string]> Header value of `null`, if there's no such header. - -#### headers.has(name) -- `name` <[string]> Case-insensetive name of the header. -- returns: <[boolean]> Returns `true` if the header with such name exists, or `false` otherwise. - -#### headers.keys() -- returns: <[iterator]> an iterator allowing to go through all keys contained in this object. The keys are [string] objects. - - -#### headers.set(name, value) -- `name` <[string]> Case-insensetive header name. -- `value` <[string]> Header value - -If there's already a header with name `name`, the header gets overwritten. - -#### headers.values() -- returns: <[iterator]<[string]>> Returns an iterator allowing to go through all values contained in this object. The values are [string] objects. - ### class: Body #### body.arrayBuffer() - returns: > @@ -1088,7 +1037,6 @@ If there's already a header with name `name`, the header gets overwritten. [number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type "Number" [Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object "Object" [Page]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page "Page" -[Headers]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-headers "Headers" [InterceptedRequest]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-interceptedrequest "Page" [Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "Promise" [string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "String" @@ -1103,3 +1051,4 @@ If there's already a header with name `name`, the header gets overwritten. [Keyboard]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-keyboard "Keyboard" [Dialog]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-dialog "Dialog" [Mouse]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-mouse "Mouse" +[Map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map "Map" diff --git a/lib/NetworkManager.js b/lib/NetworkManager.js index 019a152c781..91cc681339f 100644 --- a/lib/NetworkManager.js +++ b/lib/NetworkManager.js @@ -136,91 +136,6 @@ class NetworkManager extends EventEmitter { } } -class Headers { - /** - * @param {?Object} payload - * @return {!Headers} - */ - static fromPayload(payload) { - let headers = new Headers(); - if (!payload) - return headers; - for (let key in payload) - headers.set(key, payload[key]); - return headers; - } - - constructor() { - /** @type {!Map} */ - this._headers = new Map(); - } - - /** - * @param {string} name - * @param {string} value - */ - append(name, value) { - name = name.toLowerCase(); - this._headers.set(name, value); - } - - /** - * @param {string} name - */ - delete(name) { - name = name.toLowerCase(); - this._headers.delete(name); - } - - /** - * @return {!Iterator} - */ - entries() { - return this._headers.entries(); - } - - /** - * @param {string} name - * @return {?string} - */ - get(name) { - name = name.toLowerCase(); - return this._headers.get(name); - } - - /** - * @param {string} name - * @return {boolean} - */ - has(name) { - name = name.toLowerCase(); - return this._headers.has(name); - } - - /** - * @return {!Iterator} - */ - keys() { - return this._headers.keys(); - } - - /** - * @return {!Iterator} - */ - values() { - return this._headers.values(); - } - - /** - * @param {string} name - * @param {string} value - */ - set(name, value) { - name = name.toLowerCase(); - this._headers.set(name, value); - } -} - class Body { /** * @param {function():!Promise} contentCallback @@ -282,7 +197,7 @@ class Request extends Body { this._response = null; this.url = payload.url; this.method = payload.method; - this.headers = Headers.fromPayload(payload.headers); + this.headers = new Map(Object.entries(payload.headers)); } /** @@ -303,7 +218,7 @@ class Response extends Body { constructor(request, payload, contentCallback) { super(contentCallback); this._request = request; - this.headers = Headers.fromPayload(payload.headers); + this.headers = new Map(Object.entries(payload.headers)); this.ok = payload.status >= 200 && payload.status <= 299; this.status = payload.status; this.statusText = payload.statusText; @@ -332,7 +247,7 @@ class InterceptedRequest { this.url = payload.url; this.method = payload.method; - this.headers = Headers.fromPayload(payload.headers); + this.headers = new Map(Object.entries(payload.headers)); this.postData = payload.postData; }