// 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 optional = require('./lib/optional') , cookie = optional('tough-cookie') , Cookie = cookie && cookie.Cookie , CookieJar = cookie && cookie.CookieJar , cookieJar = CookieJar && new CookieJar , copy = require('./lib/copy') , Request = require('./request') ; // organize params for patch, post, put, head, del function initParams(uri, options, callback) { if ((typeof options === 'function') && !callback) callback = options if (options && typeof options === 'object') { options.uri = uri } else if (typeof uri === 'string') { options = {uri:uri} } else { options = uri uri = options.uri } return { uri: uri, options: options, callback: callback } } function request (uri, options, callback) { if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') if ((typeof options === 'function') && !callback) callback = options if (options && typeof options === 'object') { options.uri = uri } else if (typeof uri === 'string') { options = {uri:uri} } else { options = uri } options = copy(options) if (callback) options.callback = callback var r = new Request(options) return r } module.exports = request request.Request = Request; request.debug = process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG) request.initParams = initParams request.defaults = function (options, requester) { var def = function (method) { var d = function (uri, opts, callback) { var params = initParams(uri, opts, callback) for (var i in options) { if (params.options[i] === undefined) params.options[i] = options[i] } if(typeof requester === 'function') { if(method === request) { method = requester } else { params.options._requester = requester } } return method(params.options, params.callback) } return d } var de = def(request) de.get = def(request.get) de.patch = def(request.patch) de.post = def(request.post) de.put = def(request.put) de.head = def(request.head) de.del = def(request.del) de.cookie = def(request.cookie) de.jar = request.jar return de } function requester(params) { if(typeof params.options._requester === 'function') { return params.options._requester } else { return request } } request.forever = function (agentOptions, optionsArg) { var options = {} if (optionsArg) { for (var option in optionsArg) { options[option] = optionsArg[option] } } if (agentOptions) options.agentOptions = agentOptions options.forever = true return request.defaults(options) } request.get = request 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.head = function (uri, options, callback) { var params = initParams(uri, options, callback) params.options.method = 'HEAD' if (params.options.body || params.options.requestBodyStream || (params.options.json && typeof params.options.json !== 'boolean') || params.options.multipart) { throw new Error("HTTP HEAD requests MUST NOT include a request body.") } 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 new CookieJar } request.cookie = function (str) { if (str && str.uri) str = str.uri if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") return new Cookie(str) }