Skip to content

Commit

Permalink
Make request a little smarter with headers and datatypes
Browse files Browse the repository at this point in the history
  • Loading branch information
mde committed Jul 23, 2014
1 parent 717bd5b commit 8391895
Showing 1 changed file with 60 additions and 33 deletions.
93 changes: 60 additions & 33 deletions lib/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,6 @@ var http = require('http')
, log = require('./log')
, core = require('./core');

var formatters = {
xml: function (data) {
return data;
}
, html: function (data) {
return data;
}
, txt: function (data) {
return data;
}
, json: function (data) {
return JSON.parse(data);
}
}

/**
@name request
@namespace request
Expand All @@ -59,6 +44,7 @@ var request = function (opts, callback) {
, requester = parsed.protocol == 'http:' ? http : https
, method = (options.method && options.method.toUpperCase()) || 'GET'
, headers = core.mixin({}, options.headers || {})
, data = options.data
, contentLength
, port
, clientOpts;
Expand All @@ -71,18 +57,53 @@ var request = function (opts, callback) {
}

path = parsed.pathname;
if (parsed.search) {
path += parsed.search;
}

if (method == 'POST' || method == 'PUT') {
if (options.data) {
contentLength = Buffer.byteLength(options.data);
// Handle the payload and content-length
if (data) {
// JSON data
if (options.dataType == 'json') {
if (typeof data == 'object') {
data = JSON.stringify(data);
}
headers['Content-Type'] = headers['Content-Type'] ||
headers['content-type'] || 'application/json';
}
// Form data
else {
if (typeof data == 'object') {
data = uri.paramify(data);
}
// FIXME: What is the prefix for form-urlencoded?
headers['Content-Type'] = headers['Content-Type'] ||
headers['content-type'] || 'form-urlencoded';
}
contentLength = Buffer.byteLength(data);
}
else {
contentLength = 0
}
headers['Content-Length'] = contentLength;

if (parsed.search) {
path += parsed.search;
}
}
else {
if (data) {
// Data is an object, parse into querystring
if (typeof data == 'object') {
data = uri.paramify(data);
}
// Create querystring or append to existing
if (parsed.search) {
path += parsed.search; // search includes question mark
path += '&' + data;
}
else {
path += '?' + data;
}
}
}

clientOpts = {
Expand All @@ -96,28 +117,34 @@ var request = function (opts, callback) {
client = requester.request(clientOpts);

client.addListener('response', function (resp) {
var data = ''
, dataType;
var data = '';

resp.addListener('data', function (chunk) {
data += chunk.toString();
});

resp.addListener('end', function () {
var stat = resp.statusCode
, contentType
, err;
// Successful response
if ((stat > 199 && stat < 300) || stat == 304) {
dataType = options.dataType || uri.getFileExtension(parsed.pathname);
if (formatters[dataType]) {
try {
if (data) {
data = formatters[dataType](data);
if (data) {
contentType = response.headers['Content-Type'];
if (contentType == 'application/json' || contentType == 'text/json' ||
uri.getFileExtension(parsed.pathname) == 'json') {
try {
data = JSON.parse(data);
}
catch (e) {
return callback(e, null);
}
}
catch (e) {
callback(e, null);
}
callback(null, data);
}
else {
callback(null, null);
}
callback(null, data);
}
// Something failed
else {
Expand All @@ -133,8 +160,8 @@ var request = function (opts, callback) {
callback(e, null);
});

if ((method == 'POST' || method == 'PUT') && options.data) {
client.write(options.data);
if ((method == 'POST' || method == 'PUT') && data) {
client.write(data);
}

client.end();
Expand Down

0 comments on commit 8391895

Please sign in to comment.