Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80676 views
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
'use strict'
16
17
var extend = require('util')._extend
18
, cookies = require('./lib/cookies')
19
, helpers = require('./lib/helpers')
20
21
var isFunction = helpers.isFunction
22
, paramsHaveRequestBody = helpers.paramsHaveRequestBody
23
24
25
// organize params for patch, post, put, head, del
26
function initParams(uri, options, callback) {
27
if (typeof options === 'function') {
28
callback = options
29
}
30
31
var params = {}
32
if (typeof options === 'object') {
33
params = extend({}, options)
34
params = extend(params, {uri: uri})
35
} else if (typeof uri === 'string') {
36
params = extend({}, {uri: uri})
37
} else {
38
params = extend({}, uri)
39
}
40
41
params.callback = callback
42
return params
43
}
44
45
function request (uri, options, callback) {
46
if (typeof uri === 'undefined') {
47
throw new Error('undefined is not a valid uri or options object.')
48
}
49
50
var params = initParams(uri, options, callback)
51
52
if (params.method === 'HEAD' && paramsHaveRequestBody(params)) {
53
throw new Error('HTTP HEAD requests MUST NOT include a request body.')
54
}
55
56
return new request.Request(params)
57
}
58
59
function verbFunc (verb) {
60
var method = verb === 'del' ? 'DELETE' : verb.toUpperCase()
61
return function (uri, options, callback) {
62
var params = initParams(uri, options, callback)
63
params.method = method
64
return request(params, params.callback)
65
}
66
}
67
68
// define like this to please codeintel/intellisense IDEs
69
request.get = verbFunc('get')
70
request.head = verbFunc('head')
71
request.post = verbFunc('post')
72
request.put = verbFunc('put')
73
request.patch = verbFunc('patch')
74
request.del = verbFunc('del')
75
76
request.jar = function (store) {
77
return cookies.jar(store)
78
}
79
80
request.cookie = function (str) {
81
return cookies.parse(str)
82
}
83
84
function wrapRequestMethod (method, options, requester, verb) {
85
86
return function (uri, opts, callback) {
87
var params = initParams(uri, opts, callback)
88
89
var headerlessOptions = extend({}, options)
90
delete headerlessOptions.headers
91
params = extend(headerlessOptions, params)
92
93
if (options.headers) {
94
var headers = extend({}, options.headers)
95
params.headers = extend(headers, params.headers)
96
}
97
98
if (verb) {
99
params.method = (verb === 'del' ? 'DELETE' : verb.toUpperCase())
100
}
101
102
if (isFunction(requester)) {
103
method = requester
104
}
105
106
return method(params, params.callback)
107
}
108
}
109
110
request.defaults = function (options, requester) {
111
var self = this
112
113
if (typeof options === 'function') {
114
requester = options
115
options = {}
116
}
117
118
var defaults = wrapRequestMethod(self, options, requester)
119
120
var verbs = ['get', 'head', 'post', 'put', 'patch', 'del']
121
verbs.forEach(function(verb) {
122
defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb)
123
})
124
125
defaults.cookie = wrapRequestMethod(self.cookie, options, requester)
126
defaults.jar = self.jar
127
defaults.defaults = self.defaults
128
return defaults
129
}
130
131
request.forever = function (agentOptions, optionsArg) {
132
var options = {}
133
if (optionsArg) {
134
options = extend({}, optionsArg)
135
}
136
if (agentOptions) {
137
options.agentOptions = agentOptions
138
}
139
140
options.forever = true
141
return request.defaults(options)
142
}
143
144
// Exports
145
146
module.exports = request
147
request.Request = require('./request')
148
request.initParams = initParams
149
150
// Backwards compatibility for request.debug
151
Object.defineProperty(request, 'debug', {
152
enumerable : true,
153
get : function() {
154
return request.Request.debug
155
},
156
set : function(debug) {
157
request.Request.debug = debug
158
}
159
})
160
161