headers.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. * headers.js
  3. *
  4. * Headers class offers convenient helpers
  5. */
  6. module.exports = Headers;
  7. /**
  8. * Headers class
  9. *
  10. * @param Object headers Response headers
  11. * @return Void
  12. */
  13. function Headers(headers) {
  14. var self = this;
  15. this._headers = {};
  16. // Headers
  17. if (headers instanceof Headers) {
  18. headers = headers.raw();
  19. }
  20. // plain object
  21. for (var prop in headers) {
  22. if (!headers.hasOwnProperty(prop)) {
  23. continue;
  24. }
  25. if (typeof headers[prop] === 'string') {
  26. this.set(prop, headers[prop]);
  27. } else if (typeof headers[prop] === 'number' && !isNaN(headers[prop])) {
  28. this.set(prop, headers[prop].toString());
  29. } else if (Array.isArray(headers[prop])) {
  30. headers[prop].forEach(function(item) {
  31. self.append(prop, item.toString());
  32. });
  33. }
  34. }
  35. }
  36. /**
  37. * Return first header value given name
  38. *
  39. * @param String name Header name
  40. * @return Mixed
  41. */
  42. Headers.prototype.get = function(name) {
  43. var list = this._headers[name.toLowerCase()];
  44. return list ? list[0] : null;
  45. };
  46. /**
  47. * Return all header values given name
  48. *
  49. * @param String name Header name
  50. * @return Array
  51. */
  52. Headers.prototype.getAll = function(name) {
  53. if (!this.has(name)) {
  54. return [];
  55. }
  56. return this._headers[name.toLowerCase()];
  57. };
  58. /**
  59. * Iterate over all headers
  60. *
  61. * @param Function callback Executed for each item with parameters (value, name, thisArg)
  62. * @param Boolean thisArg `this` context for callback function
  63. * @return Void
  64. */
  65. Headers.prototype.forEach = function(callback, thisArg) {
  66. Object.getOwnPropertyNames(this._headers).forEach(function(name) {
  67. this._headers[name].forEach(function(value) {
  68. callback.call(thisArg, value, name, this)
  69. }, this)
  70. }, this)
  71. }
  72. /**
  73. * Overwrite header values given name
  74. *
  75. * @param String name Header name
  76. * @param String value Header value
  77. * @return Void
  78. */
  79. Headers.prototype.set = function(name, value) {
  80. this._headers[name.toLowerCase()] = [value];
  81. };
  82. /**
  83. * Append a value onto existing header
  84. *
  85. * @param String name Header name
  86. * @param String value Header value
  87. * @return Void
  88. */
  89. Headers.prototype.append = function(name, value) {
  90. if (!this.has(name)) {
  91. this.set(name, value);
  92. return;
  93. }
  94. this._headers[name.toLowerCase()].push(value);
  95. };
  96. /**
  97. * Check for header name existence
  98. *
  99. * @param String name Header name
  100. * @return Boolean
  101. */
  102. Headers.prototype.has = function(name) {
  103. return this._headers.hasOwnProperty(name.toLowerCase());
  104. };
  105. /**
  106. * Delete all header values given name
  107. *
  108. * @param String name Header name
  109. * @return Void
  110. */
  111. Headers.prototype['delete'] = function(name) {
  112. delete this._headers[name.toLowerCase()];
  113. };
  114. /**
  115. * Return raw headers (non-spec api)
  116. *
  117. * @return Object
  118. */
  119. Headers.prototype.raw = function() {
  120. return this._headers;
  121. };