index.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright 2010-2012 Mikeal Rogers
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. var cookies = require('./lib/cookies')
  15. , copy = require('./lib/copy')
  16. , Request = require('./request')
  17. , util = require('util')
  18. ;
  19. // organize params for patch, post, put, head, del
  20. function initParams(uri, options, callback) {
  21. var opts;
  22. if ((typeof options === 'function') && !callback) callback = options
  23. if (options && typeof options === 'object') {
  24. opts = util._extend({}, options);
  25. opts.uri = uri
  26. } else if (typeof uri === 'string') {
  27. opts = {uri:uri}
  28. } else {
  29. opts = util._extend({}, uri);
  30. uri = opts.uri
  31. }
  32. return { uri: uri, options: opts, callback: callback }
  33. }
  34. function request (uri, options, callback) {
  35. var opts;
  36. if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.')
  37. if ((typeof options === 'function') && !callback) callback = options
  38. if (options && typeof options === 'object') {
  39. opts = util._extend({}, options);
  40. opts.uri = uri
  41. } else if (typeof uri === 'string') {
  42. opts = {uri:uri}
  43. } else {
  44. opts = util._extend({}, uri);
  45. }
  46. if (callback) opts.callback = callback
  47. var r = new Request(opts)
  48. return r
  49. }
  50. module.exports = request
  51. request.Request = Request;
  52. request.debug = process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)
  53. request.initParams = initParams
  54. request.defaults = function (options, requester) {
  55. var def = function (method) {
  56. var d = function (uri, opts, callback) {
  57. var params = initParams(uri, opts, callback)
  58. Object.keys(options).forEach(function (key) {
  59. if (key !== 'headers' && params.options[key] === undefined) {
  60. params.options[key] = options[key]
  61. }
  62. })
  63. if (options.headers) {
  64. var headers = {}
  65. util._extend(headers, options.headers)
  66. util._extend(headers, params.options.headers)
  67. params.options.headers = headers
  68. }
  69. if(typeof requester === 'function') {
  70. if(method === request) {
  71. method = requester
  72. } else {
  73. params.options._requester = requester
  74. }
  75. }
  76. return method(params.options, params.callback)
  77. }
  78. return d
  79. }
  80. var de = def(request)
  81. de.get = def(request.get)
  82. de.patch = def(request.patch)
  83. de.post = def(request.post)
  84. de.put = def(request.put)
  85. de.head = def(request.head)
  86. de.del = def(request.del)
  87. de.cookie = def(request.cookie)
  88. de.jar = request.jar
  89. return de
  90. }
  91. function requester(params) {
  92. if(typeof params.options._requester === 'function') {
  93. return params.options._requester
  94. } else {
  95. return request
  96. }
  97. }
  98. request.forever = function (agentOptions, optionsArg) {
  99. var options = {}
  100. if (optionsArg) {
  101. for (var option in optionsArg) {
  102. options[option] = optionsArg[option]
  103. }
  104. }
  105. if (agentOptions) options.agentOptions = agentOptions
  106. options.forever = true
  107. return request.defaults(options)
  108. }
  109. request.get = function (uri, options, callback) {
  110. var params = initParams(uri, options, callback)
  111. params.options.method = 'GET'
  112. return requester(params)(params.uri || null, params.options, params.callback)
  113. }
  114. request.post = function (uri, options, callback) {
  115. var params = initParams(uri, options, callback)
  116. params.options.method = 'POST'
  117. return requester(params)(params.uri || null, params.options, params.callback)
  118. }
  119. request.put = function (uri, options, callback) {
  120. var params = initParams(uri, options, callback)
  121. params.options.method = 'PUT'
  122. return requester(params)(params.uri || null, params.options, params.callback)
  123. }
  124. request.patch = function (uri, options, callback) {
  125. var params = initParams(uri, options, callback)
  126. params.options.method = 'PATCH'
  127. return requester(params)(params.uri || null, params.options, params.callback)
  128. }
  129. request.head = function (uri, options, callback) {
  130. var params = initParams(uri, options, callback)
  131. params.options.method = 'HEAD'
  132. if (params.options.body ||
  133. params.options.requestBodyStream ||
  134. (params.options.json && typeof params.options.json !== 'boolean') ||
  135. params.options.multipart) {
  136. throw new Error("HTTP HEAD requests MUST NOT include a request body.")
  137. }
  138. return requester(params)(params.uri || null, params.options, params.callback)
  139. }
  140. request.del = function (uri, options, callback) {
  141. var params = initParams(uri, options, callback)
  142. params.options.method = 'DELETE'
  143. return requester(params)(params.uri || null, params.options, params.callback)
  144. }
  145. request.jar = function () {
  146. return cookies.jar();
  147. }
  148. request.cookie = function (str) {
  149. return cookies.parse(str);
  150. }