Comparing version 0.7.12-158 to 0.7.13-166
@@ -9,2 +9,3 @@ | ||
+"\nfhc storeitemgroups read <group-guid>" | ||
+"\nfhc storeitemgroups readByName <group-name>" | ||
+"\nfhc storeitemgroups update <group-guid> <group-name> <group-description>" | ||
@@ -41,2 +42,5 @@ +"\nfhc storeitemgroups addusers <group-guid> <user-email>*" | ||
return read(args[1], cb); | ||
}else if (action === 'readByName'){ | ||
if (args.length !== 2) return cb("Invalid arguments for 'readByName':" + groups.usage); | ||
return readByName(args[1], cb); | ||
}else if (action === 'update'){ | ||
@@ -108,2 +112,55 @@ if (args.length !== 4) return cb("Invalid arguments for 'update':" + groups.usage); | ||
function readByName(name, cb) { | ||
list(function(err, groups){ | ||
if(err) return cb(err); | ||
for(var i=0;i<groups.list.length;i++){ | ||
var group = groups.list[i]; | ||
if(group.name === name){ | ||
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitemgroup/read", {"guid": group.guid}, "Error reading group: ", function(err, data){ | ||
if(err) return cb(err); | ||
var storeitems = data.storeitems; | ||
var users = data.users; | ||
var retStoreItems = []; | ||
var retUsers = []; | ||
async.parallel([ | ||
function(callback){ | ||
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/list", {}, "Error listing storeitems: ", function(sierr, sidata){ | ||
if(sierr) return callback(sierr); | ||
sidata.list.forEach(function(item){ | ||
if(storeitems.indexOf(item.guid) > -1){ | ||
retStoreItems.push(item.name); | ||
} | ||
}); | ||
callback(undefined, 0); | ||
}) | ||
}, | ||
function(callback){ | ||
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/user/list", {}, "Error listing users: ", function(uerr, udata){ | ||
if(uerr) return callback(uerr); | ||
udata.list.forEach(function(item){ | ||
if(users.indexOf(item.guid) > -1){ | ||
retUsers.push({email: item.fields.email, name:item.fields.name}); | ||
} | ||
}); | ||
callback(undefined, 0); | ||
}) | ||
} | ||
], function(err, results){ | ||
if(err) return cb(err); | ||
data.storeitems = retStoreItems; | ||
data.users = retUsers; | ||
return cb(undefined, data); | ||
}); | ||
}); | ||
} else { | ||
if(i == groups.list.length - 1){ | ||
return cb("Can not find group with name " + name); | ||
} else { | ||
continue; | ||
} | ||
} | ||
} | ||
}) | ||
} | ||
// update group | ||
@@ -154,3 +211,3 @@ function update(id, name, desc, cb) { | ||
if (argv.length === 2) { | ||
var cmds = ["list", "read", "create", "update", "delete", "addapps", "removeapps", "addusers", "removeusers"]; | ||
var cmds = ["list", "read", "readByName" "create", "update", "delete", "addapps", "removeapps", "addusers", "removeusers"]; | ||
if (opts.partialWord !== "l") cmds.push("list"); | ||
@@ -157,0 +214,0 @@ return cb(undefined, cmds); |
module.exports = storeitems; | ||
storeitems.usage = "\nfhc admin-storeitems list" | ||
+"\nfhc admin-storeitems create <name> <description> <authToken> [<restrictToGroups>]" | ||
+"\nfhc admin-storeitems create <name> [description=<description>] [authToken=<authToken>] [restrictToGroups=<restrictToGroups>]" | ||
+"\nfhc admin-storeitems delete <storeitem guid>" | ||
@@ -15,3 +15,4 @@ +"\nfhc admin-storeitems read <storeitem guid>" | ||
+"\nfhc admin-storeitems addgroups <storeitem guid> <group_guid>*" | ||
+"\nfhc admin-storeitems removegroups <storeitem guid> <group_guid>*"; | ||
+"\nfhc admin-storeitems removegroups <storeitem guid> <group_guid>*" + | ||
"\nfhc admin-storeitems binaryversions <storeiten guid> "; | ||
@@ -39,3 +40,3 @@ var log = require("./utils/log"); | ||
case "create": | ||
if(args.length < 4) return cb(storeitems.usage); | ||
if(args.length < 2) return cb(storeitems.usage); | ||
args.splice(0,1); | ||
@@ -79,2 +80,5 @@ return create(args, cb); | ||
return removegroups(id, args, cb); | ||
case "binaryversions": | ||
if(args.length < 2 )return cb(storeitems.usage); | ||
return binaryversions(args[1], cb); | ||
default : | ||
@@ -88,2 +92,16 @@ return cb(storeitems.usage); | ||
function binaryversions(guid, cb){ | ||
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/read", {"guid":guid}, "Error reading item: ", function(err, data){ | ||
if(err) return cb(err); | ||
ret = {"name":data.name}; | ||
ret.versions = []; | ||
data.binaries.forEach(function (item){ | ||
item.versions.forEach(function(it){ | ||
ret.versions.push(it); | ||
}); | ||
}); | ||
return cb(undefined, ret); | ||
}); | ||
} | ||
function groupRestrict(guid, restrictToGroups, cb){ | ||
@@ -133,12 +151,14 @@ common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/grouprestrict", {"guid":guid,"restrictToGroups":restrictToGroups}, "Error set restrict-to-groups flag on item: ", function(err, data){ | ||
function create(params, cb){ | ||
var name = params[0]; | ||
var desc = params[1]; | ||
var authToken = params[2]; | ||
var payload = { | ||
"name":name, | ||
"description":desc, | ||
"authToken":authToken, | ||
"restrictToGroups":(params[3] === true || params[3] === "true") | ||
}; | ||
function create(args, cb){ | ||
var name = args.shift(); | ||
var payload = {}; | ||
args.forEach(function(arg){ | ||
var pair = arg.split("="); | ||
payload[pair[0]] = parseVal(pair[0],pair[1]); | ||
}) | ||
payload['name']= name; | ||
if(payload['restrictToGroups'] !== true) { | ||
payload['restrictToGroups']= false; | ||
} | ||
common.doApiCall(fhreq.getFeedHenryUrl(), "/box/srv/1.1/admin/storeitem/create", payload, "Error creating item: ", function(err, data){ | ||
@@ -205,3 +225,13 @@ if(err) return cb(err); | ||
} | ||
function parseVal(name, val){ | ||
if(val === "true"){ | ||
return true; | ||
} | ||
if(val === "false"){ | ||
return false; | ||
} | ||
return val; | ||
} | ||
// bash completion | ||
@@ -213,3 +243,3 @@ storeitems.completion = function (opts, cb) { | ||
if (argv.length === 2) { | ||
var cmds = ["read", "create", "update" , "list" , "delete" , "uploadicon", "uploadbinary", "addpolicy" , "removepolicy" , "listpolicies", "addgroups" , "removegroups"]; | ||
var cmds = ["read", "create", "update" , "list" , "delete" , "uploadicon", "uploadbinary", "addpolicy" , "removepolicy" , "listpolicies", "addgroups" , "removegroups", "binaryversions"]; | ||
if (opts.partialWord !== "l") cmds.push("list"); | ||
@@ -216,0 +246,0 @@ return cb(undefined, cmds); |
@@ -1,2 +0,1 @@ | ||
module.exports = request; | ||
@@ -7,3 +6,2 @@ request.GET = GET; | ||
request.POST = POST; | ||
request.upload = upload; | ||
request.uploadFile = uploadFile; | ||
@@ -15,11 +13,8 @@ request.getFeedHenryUrl = getFeedHenryUrl; | ||
var fhc = require("../fhc"); | ||
var http; | ||
var https; | ||
var requestjs = require("request"); | ||
var url = require("url"); | ||
var util = require('util'); | ||
var async = require("async"); | ||
var log = require("./log"); | ||
var ini = require("./ini"); | ||
var fs = require("fs"); | ||
var proxyify = require("./proxyify"); | ||
var os = require("os"); | ||
@@ -59,12 +54,3 @@ var keys = require("../keys"); | ||
// TODO - tidy.. | ||
if (!where.match(/^https?:\/\//)) { | ||
log.silly(where, "raw, before any munging"); | ||
if (where.charAt(0) !== "/") where = "/" + where; | ||
log.silly([fhurl, where], "url resolving"); | ||
where = url.resolve(fhurl, where); | ||
log.silly(where, "url resolved"); | ||
} else { | ||
log.silly(where, "no need to resolve"); | ||
} | ||
where = resolveUrl(where, fhurl); | ||
@@ -81,51 +67,14 @@ var remote = url.parse(where) | ||
var headers = { "accept" : "application/json" }; | ||
var cookie = fhc.config.get("cookie"); | ||
if (cookie != undefined) { | ||
headers.cookie = "feedhenry=" + cookie + ";"; | ||
log.silly(headers.cookie, "cookie"); | ||
} | ||
log.silly(fhc.config.get('nocache'), "nocache"); | ||
if (fhc.config.get('nocache')) { | ||
headers['X-FeedHenry-CacheOff'] = "script_super"; | ||
} | ||
try { | ||
var explainLvl = parseInt(fhc.config.get('explain'), 10); | ||
log.silly(explainLvl, "explain level"); | ||
if (explainLvl > 0) { | ||
headers['X-FeedHenry-Explain'] = 'active' + ((explainLvl > 1) ? ' stacktrace' : ''); | ||
} | ||
} catch (e) { | ||
log.error('explain config value should be a Number: ' + e); | ||
} | ||
var platform = '<node 0.4>'; | ||
var release = '<node 0.4>'; | ||
try{ | ||
platform = os.platform(); | ||
release = os.release(); | ||
} catch (x) { | ||
// ignored, this will fail on node 0.4.x | ||
} | ||
headers['User-Agent'] = "FHC/" + fhc.version + ' ' + platform + '/' + release; | ||
var headers = getHeaders(); | ||
var apiKey = keys.getUserApiKey(); | ||
if(null != apiKey && (typeof apiKey !== "undefined")){ | ||
headers['X-FH-AUTH-USER'] = apiKey; | ||
} | ||
if (what) { | ||
if (what instanceof File) { | ||
log.verbose(what.name, "uploading"); | ||
headers["content-type"] = "application/octet-stream"; | ||
} else { | ||
delete what._etag; | ||
log.silly(what,"writing json"); | ||
if (typeof(what) === 'string') { | ||
what = new Buffer(what); | ||
}else { | ||
what = new Buffer(JSON.stringify(what)); | ||
} | ||
headers["content-type"] = "application/json"; | ||
log.verbose(what, "what..."); | ||
delete what._etag; | ||
log.silly(what,"writing json"); | ||
if (typeof(what) === 'string') { | ||
what = new Buffer(what); | ||
}else { | ||
what = new Buffer(JSON.stringify(what)); | ||
} | ||
headers["content-type"] = "application/json"; | ||
headers["content-length"] = what.length; | ||
@@ -142,153 +91,80 @@ } else { | ||
var opts = { method: method | ||
log.silly(headers, "headers"); | ||
//if (what) log.verbose(what.toString(), "body"); | ||
var opts = { uri : where | ||
, method: method | ||
, body: what | ||
, headers: headers | ||
, path: (remote.pathname||"/") | ||
+ (remote.search||"") | ||
+ (remote.hash||"") | ||
, host: remote.hostname | ||
, secure: remote.protocol | ||
&& remote.protocol.toLowerCase() === "https:" | ||
, port: remote.port | ||
, proxy: getProxy(remote) | ||
, followRedirect : !nofollow | ||
}; | ||
if (!opts.port) opts.port = opts.secure ? 443 : 80; | ||
if (opts.port !== (opts.secure ? 443 : 80)) { | ||
opts.headers.host = opts.headers.host || opts.host; | ||
opts.headers.host += ":" + opts.port; | ||
} | ||
var startTime = Date.now(); | ||
requestjs(opts, function (error, response, body) { | ||
var data = body; | ||
opts = proxyify(fhc.config.get("proxy"), remote, opts); | ||
if (!opts) return cb(new Error("Bad proxy config: "+fhc.config.get("proxy"))); | ||
if( error ) { | ||
log.er(cb, "response error from "+where); | ||
cb(); | ||
} | ||
if (opts.secure) https = https || require("https"); | ||
else http = http || require("http"); | ||
log.silly(headers, "headers"); | ||
__stats__.duration = Date.now() - startTime; | ||
__stats__.status = response.statusCode; | ||
__stats__.body = data; | ||
var startTime = Date.now(); | ||
var req = (opts.secure ? https : http).request(opts, function (response) { | ||
log.verbose("url: " + where + " response code: " + response.statusCode, "response statusCode"); | ||
// if (response.statusCode !== 200) return cb(new Error( | ||
// "Status code " + response.statusCode + " from PUT "+where)) | ||
var data = ""; | ||
response.on("error", log.er(cb, "response error from "+where)); | ||
response.on("data", function (chunk) { | ||
log.silly(chunk+"", "chunk"); | ||
data += chunk; | ||
}); | ||
global.newloctimeout = global.newloctimeout || 0; | ||
response.on("end", function () { | ||
__stats__.duration = Date.now() - startTime; | ||
__stats__.status = response.statusCode; | ||
__stats__.body = data; | ||
log.verbose("url: " + where + " response duration: " + util.inspect(__stats__.duration), "response duration"); | ||
log.verbose("url: " + where + " response data: " + util.inspect(data), "response data"); | ||
if (!nofollow | ||
&& (response.statusCode === 301 || response.statusCode === 302)) { | ||
// relative redirects SHOULD be disallowed, but alas... | ||
var newLoc = response.headers.location; | ||
newLoc = newLoc && url.resolve(where, newLoc); | ||
log.silly(newLoc, "redirect"); | ||
if (!newLoc) return cb(new Error( | ||
response.statusCode + " status code with no location")); | ||
//FIXME: wtf? why does this timeout make it work? | ||
return setTimeout(function () { | ||
log.silly(newLoc, "redirect fer reals"); | ||
requestFunc(method, newLoc, what, etag, log.er(cb, "Failed to fetch "+newLoc)); | ||
}, 1000*(global.newloctimeout ++)); | ||
} | ||
var parsed; | ||
if (response.statusCode !== 304) { | ||
//console.log("HEADERS: " + util.inspect(response.headers['content-type'])); | ||
//console.log("DATA: " + data); | ||
log.silly(response.headers, "response headers"); | ||
var contentType = response.headers ? response.headers['content-type'] : ''; | ||
if (contentType && (contentType.indexOf('application/json') != -1 || contentType.indexOf('text/json') != -1 || contentType.indexOf('text/plain') != -1)) { | ||
try { | ||
parsed = JSON.parse(data); | ||
if (response.headers.etag) { | ||
// NOTE: not showing etags any longer in returned json (see 4712) | ||
// parsed._etag = response.headers.etag; | ||
} | ||
} catch (ex) { | ||
ex.message += "\n" + data; | ||
log.debug(data, "bad json"); | ||
log.error("error parsing json", "FeedHenry"); | ||
return cb(ex, null, data, response); | ||
} | ||
}else { | ||
parsed = data; | ||
var parsed; | ||
if (response.statusCode !== 304) { | ||
//console.log("HEADERS: " + util.inspect(response.headers['content-type'])); | ||
//console.log("DATA: " + data); | ||
log.silly(response.headers, "response headers"); | ||
var contentType = response.headers ? response.headers['content-type'] : ''; | ||
if (contentType && (contentType.indexOf('application/json') != -1 || contentType.indexOf('text/json') != -1 || contentType.indexOf('text/plain') != -1)) { | ||
try { | ||
parsed = JSON.parse(data); | ||
if (response.headers.etag) { | ||
// NOTE: not showing etags any longer in returned json (see 4712) | ||
// parsed._etag = response.headers.etag; | ||
} | ||
} catch (ex) { | ||
ex.message += "\n" + data; | ||
log.verbose(data, "bad json"); | ||
log.error("error parsing json", "FeedHenry"); | ||
return cb(ex, null, data, response); | ||
} | ||
}else { | ||
parsed = data; | ||
} | ||
var er = undefined; | ||
} | ||
var er = undefined; | ||
if (parsed && parsed.error) { | ||
var w = url.parse(where).pathname.substr(1) | ||
, name = w.split("/")[0]; | ||
if (parsed.error === "not_found") { | ||
er = new Error("404 Not Found: "+name); | ||
} else { | ||
er = parsed.error + " " + (parsed.reason || ""); | ||
} | ||
} else if (method !== "HEAD" && method !== "GET") { | ||
// invalidate cache | ||
// This is irrelevant for commands that do etag caching, but | ||
// ls and view also have a timed cache, so this keeps the user | ||
// from thinking that it didn't work when it did. | ||
// Note that failure is an acceptable option here, since the | ||
// only result will be a stale cache for some helper commands. | ||
var path = require("path") | ||
, p = url.parse(where).pathname.split("/") | ||
, _ = "/" | ||
, caches = p.map(function (part) { | ||
return _ = path.join(_, part); | ||
}).map(function (cache) { | ||
return path.join(fhc.cache, cache, ".cache.json"); | ||
}); | ||
// TODO asyncMap(caches, rm, function () {}); | ||
if (parsed && parsed.error) { | ||
var w = url.parse(where).pathname.substr(1) | ||
, name = w.split("/")[0]; | ||
if (parsed.error === "not_found") { | ||
er = new Error("404 Not Found: "+name); | ||
} else { | ||
er = parsed.error + " " + (parsed.reason || ""); | ||
} | ||
return cb(er, parsed, data, response); | ||
}); | ||
}).on("error", cb); | ||
} else if (method !== "HEAD" && method !== "GET") { | ||
// invalidate cache | ||
// This is irrelevant for commands that do etag caching, but | ||
// ls and view also have a timed cache, so this keeps the user | ||
// from thinking that it didn't work when it did. | ||
// Note that failure is an acceptable option here, since the | ||
// only result will be a stale cache for some helper commands. | ||
var path = require("path") | ||
, p = url.parse(where).pathname.split("/") | ||
, _ = "/" | ||
, caches = p.map(function (part) { | ||
return _ = path.join(_, part); | ||
}).map(function (cache) { | ||
return path.join(fhc.cache, cache, ".cache.json"); | ||
}); | ||
// TODO asyncMap(caches, rm, function () {}); | ||
} | ||
return cb(er, parsed, data, response); | ||
}) | ||
if (what instanceof File) { | ||
var size = Math.min(what.length, 1024*1024*1024) | ||
, remaining = what.length; | ||
log.silly(what.length, "bytes") | ||
;(function W () { | ||
var b = new Buffer(size); | ||
try { | ||
var bytesRead = fs.readSync(what.fd, b, 0, b.length, null); | ||
} catch (er) { | ||
return log.er(cb, "Failure to read file")(er); | ||
} | ||
remaining -= bytesRead; | ||
if (bytesRead) { | ||
log(bytesRead, "read"); | ||
log(remaining, "remain"); | ||
return ( | ||
req.write(bytesRead === b.length ? b : b.slice(0, bytesRead)) | ||
) ? W() | ||
: req.on("drain", function DRAIN () { | ||
log.silly(remaining, "drain"); | ||
req.removeListener("drain", DRAIN); | ||
W(); | ||
}); | ||
} | ||
if (!remaining) { | ||
req.end(); | ||
log.silly(what.name, "written to uploading stream"); | ||
log.silly("Not done yet! If it hangs/quits now, it didn't work.", "upload"); | ||
return; | ||
} | ||
// wtf!? No bytes read, but also bytes remaining. | ||
return cb(new Error("Some kind of weirdness reading the file")); | ||
})(); | ||
return | ||
} else if (typeof what === "string" || Buffer.isBuffer(what)) { | ||
// just a json blob | ||
req.write(what); | ||
} | ||
req.end(); | ||
} | ||
@@ -327,15 +203,2 @@ | ||
function upload (url, where, filename, etag, nofollow, cb) { | ||
if (typeof nofollow === "function") cb = nofollow, nofollow = false; | ||
if (typeof etag === "function") cb = etag, etag = null; | ||
new File(filename, function (er, f) { | ||
if (er) return log.er(cb, "Couldn't open "+filename)(er); | ||
PUT(url, where, f, etag, nofollow, function (er) { | ||
log.info("done with upload", "upload"); | ||
cb(er); | ||
}); | ||
}); | ||
} | ||
function uploadFile(url, filepath, fields, contentType, cb){ | ||
@@ -398,3 +261,3 @@ var boundary = Math.random(); | ||
'Content-Length' : length, | ||
'Cookie' : "feedhenry=" + fhc.config.get("cookie") + ";" | ||
'Cookie' : "feedhenry=" + fhc.config.get("cookie") + ";" | ||
} | ||
@@ -427,2 +290,82 @@ }; | ||
// NOTE: the request upload doesn't work on all FH clusters | ||
function REQUEST_uploadFile(fhurl, filepath, fields, contentType, cb){ | ||
var boundary = Math.random(); | ||
var post_data = []; | ||
var path = require('path'); | ||
var filename = path.basename(filepath); | ||
var fullUrl = resolveUrl(fhurl); | ||
var remote = url.parse(fullUrl); | ||
var headers = getHeaders(); | ||
var opts = { | ||
url : fullUrl | ||
, headers : headers | ||
, proxy : getProxy(remote) | ||
}; | ||
log.verbose(opts, "uploadFile - opts"); | ||
var r = requestjs.post(opts); | ||
// Get a handle on a form for Multi Part Form Upload | ||
var form = r.form(); | ||
// Add all passed fields to the form | ||
for(var key in fields){ | ||
// Dirty hack to get around the limitations of CombinedStream.isStreamLike()... | ||
// i.e. uit thinks booleans are streams! | ||
var value = fields[key] + ""; | ||
log.verbose('Adding form field ' + key + " with value " + value); | ||
form.append(key, value); | ||
} | ||
// Add the file to the form | ||
form.append('file', fs.createReadStream(filepath)); | ||
// Get the content length of the form once it is finished adding all fields. | ||
form.getLength(function(err, length) { | ||
if(err) cb(err); | ||
log.verbose(length, "form.getLength()"); | ||
headers["content-length"] = length; | ||
// Set the headers on the request object | ||
r.setHeaders(headers); | ||
}); | ||
r.on("error", function (er) { | ||
log.er(er); | ||
cb(er); | ||
}) | ||
r.on('response', function(response){ | ||
log.silly('received response'); | ||
response.setEncoding('utf8'); | ||
var data = ''; | ||
response.on('data', function(chunk){ | ||
data = data + chunk; | ||
}); | ||
response.on('end', function(){ | ||
log.silly(data, "DATA"); | ||
data = JSON.parse(data); | ||
return cb(undefined, data); | ||
}); | ||
response.on('error', function(err) { | ||
return cb(err); | ||
}); | ||
}); | ||
return r; | ||
} | ||
function File (name, cb) { | ||
@@ -447,3 +390,3 @@ var f = this; | ||
var r = fhc.config.get("feedhenry"); | ||
log.silly(r, "feedhenry url"); | ||
log.verbose(r, "feedhenry url"); | ||
if (!r) { | ||
@@ -466,1 +409,63 @@ return new Error("Must define feedhenry URL before accessing FeedHenry."); | ||
} | ||
function resolveUrl(where, fhurl) { | ||
log.verbose(where, "resolveUrl - IN"); | ||
if (!where.match(/^https?:\/\//)) { | ||
if (where.charAt(0) !== "/") where = "/" + where; | ||
fhurl = fhurl || getFeedHenryUrl(); | ||
where = url.resolve(fhurl, where); | ||
} | ||
log.verbose(where, "resolveUrl - OUT"); | ||
return where; | ||
} | ||
function getHeaders() { | ||
var headers = { "accept" : "application/json" }; | ||
var cookie = fhc.config.get("cookie"); | ||
if (cookie != undefined) { | ||
headers.cookie = "feedhenry=" + cookie + ";"; | ||
log.silly(headers.cookie, "cookie"); | ||
} | ||
log.silly(fhc.config.get('nocache'), "nocache"); | ||
if (fhc.config.get('nocache')) { | ||
headers['X-FeedHenry-CacheOff'] = "script_super"; | ||
} | ||
try { | ||
var explainLvl = parseInt(fhc.config.get('explain'), 10); | ||
log.silly(explainLvl, "explain level"); | ||
if (explainLvl > 0) { | ||
headers['X-FeedHenry-Explain'] = 'active' + ((explainLvl > 1) ? ' stacktrace' : ''); | ||
} | ||
} catch (e) { | ||
log.error('explain config value should be a Number: ' + e); | ||
} | ||
var platform = '<node 0.4>'; | ||
var release = '<node 0.4>'; | ||
try{ | ||
platform = os.platform(); | ||
release = os.release(); | ||
} catch (x) { | ||
// ignored, this will fail on node 0.4.x | ||
} | ||
headers['User-Agent'] = "FHC/" + fhc.version + ' ' + platform + '/' + release; | ||
var apiKey = keys.getUserApiKey(); | ||
if(null != apiKey && (typeof apiKey !== "undefined")){ | ||
headers['X-FH-AUTH-USER'] = apiKey; | ||
} | ||
log.verbose(headers, "getHeaders"); | ||
return headers; | ||
} | ||
function getProxy(url) { | ||
var proxy | ||
if (url.protocol !== "https:" || !(proxy = fhc.config.get("https-proxy"))) { | ||
proxy = fhc.config.get("proxy") | ||
} | ||
log.silly(proxy, "getProxy"); | ||
return proxy; | ||
} |
@@ -5,3 +5,3 @@ { | ||
"keywords" : [ "cli", "feedhenry" ], | ||
"version": "0.7.12-158", | ||
"version": "0.7.13-166", | ||
"preferGlobal" : true, | ||
@@ -25,3 +25,3 @@ "homepage" : "http://git.io/fh-fhc", | ||
"async" : "*", | ||
"request" : "*", | ||
"request" : "~2.11", | ||
"vmcjs" : "*", | ||
@@ -28,0 +28,0 @@ "cli-table" : "git://github.com/LearnBoost/cli-table.git#703ab71" |
@@ -1,1 +0,1 @@ | ||
0.7.12-158 | ||
0.7.13-166 |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Non-existent author
Supply chain riskThe package was published by an npm account that no longer exists.
Found 1 instance in 1 package
Wildcard dependency
QualityPackage has a dependency with a floating version range. This can cause issues if the dependency publishes a new major version.
Found 1 instance in 1 package
9147
4
21
351762
137
2
+ Addedrequest@2.11.4(transitive)
- Removedajv@6.12.6(transitive)
- Removedasn1@0.2.6(transitive)
- Removedassert-plus@1.0.0(transitive)
- Removedasynckit@0.4.0(transitive)
- Removedaws-sign2@0.7.0(transitive)
- Removedaws4@1.13.2(transitive)
- Removedbcrypt-pbkdf@1.0.2(transitive)
- Removedcaseless@0.12.0(transitive)
- Removedcombined-stream@1.0.8(transitive)
- Removedcore-util-is@1.0.2(transitive)
- Removeddashdash@1.14.1(transitive)
- Removeddelayed-stream@1.0.0(transitive)
- Removedecc-jsbn@0.1.2(transitive)
- Removedextend@3.0.2(transitive)
- Removedextsprintf@1.3.0(transitive)
- Removedfast-deep-equal@3.1.3(transitive)
- Removedfast-json-stable-stringify@2.1.0(transitive)
- Removedforever-agent@0.6.1(transitive)
- Removedform-data@2.3.3(transitive)
- Removedgetpass@0.1.7(transitive)
- Removedhar-schema@2.0.0(transitive)
- Removedhar-validator@5.1.5(transitive)
- Removedhttp-signature@1.2.0(transitive)
- Removedis-typedarray@1.0.0(transitive)
- Removedisstream@0.1.2(transitive)
- Removedjsbn@0.1.1(transitive)
- Removedjson-schema@0.4.0(transitive)
- Removedjson-schema-traverse@0.4.1(transitive)
- Removedjson-stringify-safe@5.0.1(transitive)
- Removedjsprim@1.4.2(transitive)
- Removedmime-db@1.52.0(transitive)
- Removedmime-types@2.1.35(transitive)
- Removedoauth-sign@0.9.0(transitive)
- Removedperformance-now@2.1.0(transitive)
- Removedpsl@1.9.0(transitive)
- Removedpunycode@2.3.1(transitive)
- Removedqs@6.5.3(transitive)
- Removedrequest@2.88.2(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedsafer-buffer@2.1.2(transitive)
- Removedsshpk@1.18.0(transitive)
- Removedtough-cookie@2.5.0(transitive)
- Removedtunnel-agent@0.6.0(transitive)
- Removedtweetnacl@0.14.5(transitive)
- Removeduri-js@4.4.1(transitive)
- Removeduuid@3.4.0(transitive)
- Removedverror@1.10.0(transitive)
Updatedrequest@~2.11