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

// 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