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 , CookieJar = Cookie && Cookie.CookieJar
18 , cookieJar = CookieJar && new CookieJar
20 , copy = require('./lib/copy')
21 , Request = require('./request')
26 // organize params for patch, post, put, head, del
27 function initParams(uri, options, callback) {
28 if ((typeof options === 'function') && !callback) callback = options
29 if (options && typeof options === 'object') {
31 } else if (typeof uri === 'string') {
37 return { uri: uri, options: options, callback: callback }
40 function request (uri, options, callback) {
41 if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.')
42 if ((typeof options === 'function') && !callback) callback = options
43 if (options && typeof options === 'object') {
45 } else if (typeof uri === 'string') {
51 options = copy(options)
53 if (callback) options.callback = callback
54 var r = new Request(options)
58 module.exports = request
60 request.Request = Request;
62 request.debug = process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)
64 request.initParams = initParams
66 request.defaults = function (options, requester) {
67 var def = function (method) {
68 var d = function (uri, opts, callback) {
69 var params = initParams(uri, opts, callback)
70 for (var i in options) {
71 if (params.options[i] === undefined) params.options[i] = options[i]
73 if(typeof requester === 'function') {
74 if(method === request) {
77 params.options._requester = requester
80 return method(params.options, params.callback)
85 de.get = def(request.get)
86 de.patch = def(request.patch)
87 de.post = def(request.post)
88 de.put = def(request.put)
89 de.head = def(request.head)
90 de.del = def(request.del)
91 de.cookie = def(request.cookie)
96 function requester(params) {
97 if(typeof params.options._requester === 'function') {
98 return params.options._requester
104 request.forever = function (agentOptions, optionsArg) {
107 for (option in optionsArg) {
108 options[option] = optionsArg[option]
111 if (agentOptions) options.agentOptions = agentOptions
112 options.forever = true
113 return request.defaults(options)
116 request.get = request
117 request.post = function (uri, options, callback) {
118 var params = initParams(uri, options, callback)
119 params.options.method = 'POST'
120 return requester(params)(params.uri || null, params.options, params.callback)
122 request.put = function (uri, options, callback) {
123 var params = initParams(uri, options, callback)
124 params.options.method = 'PUT'
125 return requester(params)(params.uri || null, params.options, params.callback)
127 request.patch = function (uri, options, callback) {
128 var params = initParams(uri, options, callback)
129 params.options.method = 'PATCH'
130 return requester(params)(params.uri || null, params.options, params.callback)
132 request.head = function (uri, options, callback) {
133 var params = initParams(uri, options, callback)
134 params.options.method = 'HEAD'
135 if (params.options.body ||
136 params.options.requestBodyStream ||
137 (params.options.json && typeof params.options.json !== 'boolean') ||
138 params.options.multipart) {
139 throw new Error("HTTP HEAD requests MUST NOT include a request body.")
142 return requester(params)(params.uri || null, params.options, params.callback)
144 request.del = function (uri, options, callback) {
145 var params = initParams(uri, options, callback)
146 params.options.method = 'DELETE'
147 return requester(params)(params.uri || null, params.options, params.callback)
149 request.jar = function () {
152 request.cookie = function (str) {
153 if (str && str.uri) str = str.uri
154 if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param")
155 return new Cookie(str)