dfcdb3d9bc2012e272caba36a724317ef6b9a5e1
[platform/upstream/nodejs.git] / deps / npm / node_modules / request / index.js
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
15 var optional = require('./lib/optional')
16   , Cookie = optional('tough-cookie')
17   , CookieJar = Cookie && Cookie.CookieJar
18   , cookieJar = CookieJar && new CookieJar
19
20   , copy = require('./lib/copy')
21   , Request = require('./request')
22   ;
23
24
25
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') {
30     options.uri = uri
31   } else if (typeof uri === 'string') {
32     options = {uri:uri}
33   } else {
34     options = uri
35     uri = options.uri
36   }
37   return { uri: uri, options: options, callback: callback }
38 }
39
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') {
44     options.uri = uri
45   } else if (typeof uri === 'string') {
46     options = {uri:uri}
47   } else {
48     options = uri
49   }
50
51   options = copy(options)
52
53   if (callback) options.callback = callback
54   var r = new Request(options)
55   return r
56 }
57
58 module.exports = request
59
60 request.Request = Request;
61
62 request.debug = process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)
63
64 request.initParams = initParams
65
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]
72       }
73       if(typeof requester === 'function') {
74         if(method === request) {
75           method = requester
76         } else {
77           params.options._requester = requester
78         }
79       }
80       return method(params.options, params.callback)
81     }
82     return d
83   }
84   var de = def(request)
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)
92   de.jar = request.jar
93   return de
94 }
95
96 function requester(params) {
97   if(typeof params.options._requester === 'function') {
98     return params.options._requester
99   } else {
100     return request
101   }
102 }
103
104 request.forever = function (agentOptions, optionsArg) {
105   var options = {}
106   if (optionsArg) {
107     for (option in optionsArg) {
108       options[option] = optionsArg[option]
109     }
110   }
111   if (agentOptions) options.agentOptions = agentOptions
112   options.forever = true
113   return request.defaults(options)
114 }
115
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)
121 }
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)
126 }
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)
131 }
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.")
140   }
141
142   return requester(params)(params.uri || null, params.options, params.callback)
143 }
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)
148 }
149 request.jar = function () {
150   return new CookieJar
151 }
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)
156 }