1 // Copyright 2010-2012 Mikeal Rogers
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 var optional = require('./lib/optional')
16 , cookie = optional('tough-cookie')
17 , Cookie = cookie && cookie.Cookie
18 , CookieJar = cookie && cookie.CookieJar
19 , cookieJar = CookieJar && new CookieJar
21 , copy = require('./lib/copy')
22 , Request = require('./request')
27 // organize params for patch, post, put, head, del
28 function initParams(uri, options, callback) {
29 if ((typeof options === 'function') && !callback) callback = options
30 if (options && typeof options === 'object') {
32 } else if (typeof uri === 'string') {
38 return { uri: uri, options: options, callback: callback }
41 function request (uri, options, callback) {
42 if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.')
43 if ((typeof options === 'function') && !callback) callback = options
44 if (options && typeof options === 'object') {
46 } else if (typeof uri === 'string') {
52 options = copy(options)
54 if (callback) options.callback = callback
55 var r = new Request(options)
59 module.exports = request
61 request.Request = Request;
63 request.debug = process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)
65 request.initParams = initParams
67 request.defaults = function (options, requester) {
68 var def = function (method) {
69 var d = function (uri, opts, callback) {
70 var params = initParams(uri, opts, callback)
71 for (var i in options) {
72 if (params.options[i] === undefined) params.options[i] = options[i]
74 if(typeof requester === 'function') {
75 if(method === request) {
78 params.options._requester = requester
81 return method(params.options, params.callback)
86 de.get = def(request.get)
87 de.patch = def(request.patch)
88 de.post = def(request.post)
89 de.put = def(request.put)
90 de.head = def(request.head)
91 de.del = def(request.del)
92 de.cookie = def(request.cookie)
97 function requester(params) {
98 if(typeof params.options._requester === 'function') {
99 return params.options._requester
105 request.forever = function (agentOptions, optionsArg) {
108 for (var option in optionsArg) {
109 options[option] = optionsArg[option]
112 if (agentOptions) options.agentOptions = agentOptions
113 options.forever = true
114 return request.defaults(options)
117 request.get = request
118 request.post = function (uri, options, callback) {
119 var params = initParams(uri, options, callback)
120 params.options.method = 'POST'
121 return requester(params)(params.uri || null, params.options, params.callback)
123 request.put = function (uri, options, callback) {
124 var params = initParams(uri, options, callback)
125 params.options.method = 'PUT'
126 return requester(params)(params.uri || null, params.options, params.callback)
128 request.patch = function (uri, options, callback) {
129 var params = initParams(uri, options, callback)
130 params.options.method = 'PATCH'
131 return requester(params)(params.uri || null, params.options, params.callback)
133 request.head = function (uri, options, callback) {
134 var params = initParams(uri, options, callback)
135 params.options.method = 'HEAD'
136 if (params.options.body ||
137 params.options.requestBodyStream ||
138 (params.options.json && typeof params.options.json !== 'boolean') ||
139 params.options.multipart) {
140 throw new Error("HTTP HEAD requests MUST NOT include a request body.")
143 return requester(params)(params.uri || null, params.options, params.callback)
145 request.del = function (uri, options, callback) {
146 var params = initParams(uri, options, callback)
147 params.options.method = 'DELETE'
148 return requester(params)(params.uri || null, params.options, params.callback)
150 request.jar = function () {
153 request.cookie = function (str) {
154 if (str && str.uri) str = str.uri
155 if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param")
156 return new Cookie(str)