Skip to content

Commit

Permalink
http: use Symbol for outgoing headers
Browse files Browse the repository at this point in the history
PR-URL: #10941
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
  • Loading branch information
mscdex committed Mar 9, 2017
1 parent 86996c5 commit 940b530
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 16 deletions.
5 changes: 3 additions & 2 deletions lib/_http_client.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const OutgoingMessage = require('_http_outgoing').OutgoingMessage;
const Agent = require('_http_agent');
const Buffer = require('buffer').Buffer;
const urlToOptions = require('internal/url').urlToOptions;
const outHeadersKey = require('internal/http').outHeadersKey;

// The actual list of disallowed characters in regexp form is more like:
// /[^A-Za-z0-9\-._~!$&'()*+,;=/:@]/
Expand Down Expand Up @@ -182,7 +183,7 @@ function ClientRequest(options, cb) {
'client');
}
self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\r\n',
self._headers);
self[outHeadersKey]);
}

this._ended = false;
Expand Down Expand Up @@ -278,7 +279,7 @@ ClientRequest.prototype._implicitHeader = function _implicitHeader() {
throw new Error('Can\'t render headers after they are sent to the client');
}
this._storeHeader(this.method + ' ' + this.path + ' HTTP/1.1\r\n',
this._headers);
this[outHeadersKey]);
};

ClientRequest.prototype.abort = function abort() {
Expand Down
26 changes: 14 additions & 12 deletions lib/_http_outgoing.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ const Buffer = require('buffer').Buffer;
const common = require('_http_common');
const checkIsHttpToken = common._checkIsHttpToken;
const checkInvalidHeaderChar = common._checkInvalidHeaderChar;
const outHeadersKey = require('internal/http').outHeadersKey;
const StorageObject = require('internal/querystring').StorageObject;

const CRLF = common.CRLF;
const debug = common.debug;
Expand Down Expand Up @@ -74,7 +76,7 @@ function OutgoingMessage() {
this.socket = null;
this.connection = null;
this._header = null;
this._headers = null;
this[outHeadersKey] = null;

this._onPendingData = null;
}
Expand Down Expand Up @@ -201,7 +203,7 @@ function _storeHeader(firstLine, headers) {
var value;
var i;
var j;
if (headers === this._headers) {
if (headers === this[outHeadersKey]) {
for (key in headers) {
var entry = headers[key];
field = entry[0];
Expand Down Expand Up @@ -393,11 +395,11 @@ function validateHeader(msg, name, value) {
OutgoingMessage.prototype.setHeader = function setHeader(name, value) {
validateHeader(this, name, value);

if (!this._headers)
this._headers = {};
if (!this[outHeadersKey])
this[outHeadersKey] = {};

const key = name.toLowerCase();
this._headers[key] = [name, value];
this[outHeadersKey][key] = [name, value];

switch (key.length) {
case 10:
Expand All @@ -421,9 +423,9 @@ OutgoingMessage.prototype.getHeader = function getHeader(name) {
throw new TypeError('"name" argument must be a string');
}

if (!this._headers) return;
if (!this[outHeadersKey]) return;

var entry = this._headers[name.toLowerCase()];
var entry = this[outHeadersKey][name.toLowerCase()];
if (!entry)
return;
return entry[1];
Expand All @@ -432,13 +434,13 @@ OutgoingMessage.prototype.getHeader = function getHeader(name) {

// Returns an array of the names of the current outgoing headers.
OutgoingMessage.prototype.getHeaderNames = function getHeaderNames() {
return (this._headers ? Object.keys(this._headers) : []);
return (this[outHeadersKey] ? Object.keys(this[outHeadersKey]) : []);
};


// Returns a shallow copy of the current outgoing headers.
OutgoingMessage.prototype.getHeaders = function getHeaders() {
const headers = this._headers;
const headers = this[outHeadersKey];
const ret = new OutgoingHeaders();
if (headers) {
const keys = Object.keys(headers);
Expand All @@ -457,7 +459,7 @@ OutgoingMessage.prototype.hasHeader = function hasHeader(name) {
throw new TypeError('"name" argument must be a string');
}

return !!(this._headers && this._headers[name.toLowerCase()]);
return !!(this[outHeadersKey] && this[outHeadersKey][name.toLowerCase()]);
};


Expand Down Expand Up @@ -491,8 +493,8 @@ OutgoingMessage.prototype.removeHeader = function removeHeader(name) {
break;
}

if (this._headers) {
delete this._headers[key];
if (this[outHeadersKey]) {
delete this[outHeadersKey][key];
}
};

Expand Down
5 changes: 3 additions & 2 deletions lib/_http_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const continueExpression = common.continueExpression;
const chunkExpression = common.chunkExpression;
const httpSocketSetup = common.httpSocketSetup;
const OutgoingMessage = require('_http_outgoing').OutgoingMessage;
const outHeadersKey = require('internal/http').outHeadersKey;

const STATUS_CODES = exports.STATUS_CODES = {
100: 'Continue',
Expand Down Expand Up @@ -179,7 +180,7 @@ function writeHead(statusCode, reason, obj) {
this.statusCode = statusCode;

var headers;
if (this._headers) {
if (this[outHeadersKey]) {
// Slow-case: when progressive API and header fields are passed.
var k;
if (obj) {
Expand All @@ -196,7 +197,7 @@ function writeHead(statusCode, reason, obj) {
}
}
// only progressive api is used
headers = this._headers;
headers = this[outHeadersKey];
} else {
// only writeHead() called
headers = obj;
Expand Down
5 changes: 5 additions & 0 deletions lib/internal/http.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

module.exports = {
outHeadersKey: Symbol('outHeadersKey')
};
1 change: 1 addition & 0 deletions node.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
'lib/internal/errors.js',
'lib/internal/freelist.js',
'lib/internal/fs.js',
'lib/internal/http.js',
'lib/internal/linkedlist.js',
'lib/internal/net.js',
'lib/internal/module.js',
Expand Down

0 comments on commit 940b530

Please sign in to comment.