Skip to content

Instantly share code, notes, and snippets.

@meeDamian
Last active August 29, 2015 13:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save meeDamian/10049315 to your computer and use it in GitHub Desktop.
Save meeDamian/10049315 to your computer and use it in GitHub Desktop.
http = require 'http'
https = require 'https'
url = require 'url'
querystring = require 'querystring'
class Downloader
constructor: (@url, @method="GET", headers, @params) ->
@headers =
'User-Agent': '*Coin-Monitor'
'Content-Type': "application/x-www-form-urlencoded"
@setHeader key, value for key, value of headers
@setPersistentHeaders: (@persistentHeaders) ->
@setSignGenerator = (@signGenerator) ->
# instance methods
setHeader: (key, value) -> @headers[key] = value
setBodyParameter: (key, value) ->
@params ?= {}
@params[key] = value
send: (includeAuthHeaders..., @callback) ->
[@includeAuthHeaders, _...] = includeAuthHeaders
@includeAuthHeaders ?= true
return callback "invalid url" unless @url
query = querystring.stringify @params
@setHeader 'Content-Length', query.length if query.length
u = url.parse @url
protocol = if u.protocol is "http:" then http else https
if @includeAuthHeaders
if Downloader.persistentHeaders?
@setHeader key, value for key, value of Downloader.persistentHeaders
if Downloader.signGenerator?
@setHeader 'Sign', Downloader.signGenerator @params
options =
method: @method
headers: @headers
host: u.host
path: u.path
protocol.request options, (r) ->
data = ""
r.on 'data', (c) -> data += c
r.on 'end', (err) ->
return callback err if err
try
data = JSON.parse data
catch e
return callback e
console.log ".coffee"
callback null, data
.on 'error', (e) -> callback e
.end query
module.exports = Downloader;
/**
*
* Object responsible for handling all REST requests
*
**/
var http = require('http'),
https = require('https'),
url = require('url'),
querystring = require('querystring'),
_ = require('underscore');
var Downloader = function( url, method, headers, params ) {
this.url = url;
this.headers = {
'User-Agent': "*Coin-Monitor",
'Content-Type': "application/x-www-form-urlencoded"
};
var ctx = this;
if( !_.isUndefined(headers) ) _.each(headers, ctx._setHeader(ctx));
if( !_.isUndefined(params) ) this.params = params;
this.method = ( !_.isUndefined(method) ) ? method : "GET";
};
Downloader.persistentHeaders = null;
Downloader.setPersistentHeaders = function(headers) {
this.persistentHeaders = headers;
};
Downloader.signGenerator = null;
Downloader.setSignGenerator = function( signGenerator ) {
this.signGenerator = signGenerator;
};
Downloader.prototype.setHeader = function( key, value ) {
this.headers[key] = value;
};
Downloader.prototype._setHeader = function( ctx ) { // the same as setHeader, but with reversed parameters
return function(value, key) { ctx.setHeader(key, value) };
};
Downloader.prototype.setBodyParameter = function( key, value ) {
if( !_.isObject(this.params) ) this.params = {};
this.params[key] = value;
};
Downloader.prototype.send = function( arg1, arg2 ) {
var includeAuthHeaders = true;
if(typeof arg1==='boolean') {
includeAuthHeaders = arg1;
callback = arg2;
} else callback = arg1;
if( !this.url ) return callback("invalid url");
var query = querystring.stringify(this.params);
if( query.length ) this.setHeader('Content-Length', query.length);
var u = url.parse( this.url );
var protocol = u.protocol=="http:" ? http : https;
if( includeAuthHeaders ) {
var ctx = this;
if( Downloader.persistentHeaders!=null )
_.each(Downloader.persistentHeaders, ctx._setHeader(ctx));
if( Downloader.signGenerator!=null )
this.setHeader('Sign', Downloader.signGenerator(this.params));
}
var options = {
method: this.method,
headers: this.headers,
host: u.host,
path: u.path
};
protocol.request(options, function(r) {
var data = "";
r.on('data', function(c){ data+=c; });
r.on('end', function(err) {
if( err ) return callback(err);
try {
data = JSON.parse(data);
} catch( e ) {
return callback(e);
}
return callback(null, data);
});
}).on('error', function(e) {
return callback(e);
}).end(query);
};
module.exports = Downloader;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment