mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.1 KiB
166 lines
5.1 KiB
// Copyright 2010-2012 Mikeal Rogers
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
var extend = require('util')._extend
|
|
, cookies = require('./lib/cookies')
|
|
, copy = require('./lib/copy')
|
|
, helpers = require('./lib/helpers')
|
|
, isFunction = helpers.isFunction
|
|
, constructObject = helpers.constructObject
|
|
, filterForCallback = helpers.filterForCallback
|
|
, constructOptionsFrom = helpers.constructOptionsFrom
|
|
, paramsHaveRequestBody = helpers.paramsHaveRequestBody
|
|
;
|
|
|
|
// organize params for patch, post, put, head, del
|
|
function initParams(uri, options, callback) {
|
|
callback = filterForCallback([options, callback])
|
|
options = constructOptionsFrom(uri, options)
|
|
|
|
return constructObject()
|
|
.extend({callback: callback})
|
|
.extend({options: options})
|
|
.extend({uri: options.uri})
|
|
.done()
|
|
}
|
|
|
|
function request (uri, options, callback) {
|
|
if (typeof uri === 'undefined')
|
|
throw new Error('undefined is not a valid uri or options object.')
|
|
|
|
var params = initParams(uri, options, callback)
|
|
options = params.options
|
|
options.callback = params.callback
|
|
options.uri = params.uri
|
|
|
|
return new request.Request(options)
|
|
}
|
|
|
|
function requester(params) {
|
|
if(typeof params.options._requester === 'function')
|
|
return params.options._requester
|
|
return request
|
|
}
|
|
|
|
request.get = function (uri, options, callback) {
|
|
var params = initParams(uri, options, callback)
|
|
params.options.method = 'GET'
|
|
return requester(params)(params.uri || null, params.options, params.callback)
|
|
}
|
|
|
|
request.head = function (uri, options, callback) {
|
|
var params = initParams(uri, options, callback)
|
|
params.options.method = 'HEAD'
|
|
|
|
if (paramsHaveRequestBody(params))
|
|
throw new Error("HTTP HEAD requests MUST NOT include a request body.")
|
|
|
|
return requester(params)(params.uri || null, params.options, params.callback)
|
|
}
|
|
|
|
request.post = function (uri, options, callback) {
|
|
var params = initParams(uri, options, callback)
|
|
params.options.method = 'POST'
|
|
return requester(params)(params.uri || null, params.options, params.callback)
|
|
}
|
|
|
|
request.put = function (uri, options, callback) {
|
|
var params = initParams(uri, options, callback)
|
|
params.options.method = 'PUT'
|
|
return requester(params)(params.uri || null, params.options, params.callback)
|
|
}
|
|
|
|
request.patch = function (uri, options, callback) {
|
|
var params = initParams(uri, options, callback)
|
|
params.options.method = 'PATCH'
|
|
return requester(params)(params.uri || null, params.options, params.callback)
|
|
}
|
|
|
|
request.del = function (uri, options, callback) {
|
|
var params = initParams(uri, options, callback)
|
|
params.options.method = 'DELETE'
|
|
return requester(params)(params.uri || null, params.options, params.callback)
|
|
}
|
|
|
|
request.jar = function () {
|
|
return cookies.jar()
|
|
}
|
|
|
|
request.cookie = function (str) {
|
|
return cookies.parse(str)
|
|
}
|
|
|
|
request.defaults = function (options, requester) {
|
|
|
|
var wrap = function (method) {
|
|
var headerlessOptions = function (options) {
|
|
options = extend({}, options)
|
|
delete options.headers
|
|
return options
|
|
}
|
|
|
|
var getHeaders = function (params, options) {
|
|
return constructObject()
|
|
.extend(options.headers)
|
|
.extend(params.options.headers)
|
|
.done()
|
|
}
|
|
|
|
return function (uri, opts, callback) {
|
|
var params = initParams(uri, opts, callback)
|
|
params.options = extend(params.options, headerlessOptions(options))
|
|
|
|
if (options.headers)
|
|
params.options.headers = getHeaders(params, options)
|
|
|
|
if (isFunction(requester)) {
|
|
if (method === request) {
|
|
method = requester
|
|
} else {
|
|
params.options._requester = requester
|
|
}
|
|
}
|
|
|
|
return method(params.options, params.callback)
|
|
}
|
|
}
|
|
|
|
defaults = wrap(this)
|
|
defaults.get = wrap(this.get)
|
|
defaults.patch = wrap(this.patch)
|
|
defaults.post = wrap(this.post)
|
|
defaults.put = wrap(this.put)
|
|
defaults.head = wrap(this.head)
|
|
defaults.del = wrap(this.del)
|
|
defaults.cookie = wrap(this.cookie)
|
|
defaults.jar = this.jar
|
|
defaults.defaults = this.defaults
|
|
return defaults
|
|
}
|
|
|
|
request.forever = function (agentOptions, optionsArg) {
|
|
var options = constructObject()
|
|
if (optionsArg) options.extend(optionsArg)
|
|
if (agentOptions) options.agentOptions = agentOptions
|
|
|
|
options.extend({forever: true})
|
|
return request.defaults(options.done())
|
|
}
|
|
|
|
// Exports
|
|
|
|
module.exports = request
|
|
request.Request = require('./request')
|
|
request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG)
|
|
request.initParams = initParams
|
|
|