client.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. var https = require("https");
  2. var http = require("http");
  3. var extend = require("./extend");
  4. var HttpsProxyAgent = require("https-proxy-agent");
  5. var userAgent = getUA();
  6. function getUA() {
  7. var os = require("os");
  8. var version = require("../package.json").version;
  9. return os.platform() + "/" + os.release() + " " +
  10. "node/" + process.versions.node + " " +
  11. "node-browserstack/" + version;
  12. }
  13. var BaseClient = function(settings) {
  14. if (!settings.username) {
  15. throw new Error("Username is required.");
  16. }
  17. if (!settings.password) {
  18. throw new Error("Password is required.");
  19. }
  20. extend(this, settings);
  21. this.authHeader = "Basic " +
  22. new Buffer(this.username + ":" + this.password).toString("base64");
  23. };
  24. BaseClient.prototype.request = function(options, data, fn) {
  25. if (typeof data === "function") {
  26. fn = data;
  27. data = null;
  28. }
  29. fn = fn || function() {};
  30. var reqOptions = extend({
  31. host: this.server.host,
  32. port: this.server.port,
  33. method: "GET",
  34. headers: {
  35. authorization: this.authHeader,
  36. "content-type": "application/json",
  37. "user-agent": userAgent,
  38. "content-length": typeof data === "string" ? data.length : 0
  39. },
  40. agent: (this.proxy) ? new HttpsProxyAgent(this.proxy) : null
  41. }, options);
  42. var req = (this.useHttp ? http : https).request(reqOptions, function(res) {
  43. var response = "";
  44. res.setEncoding("utf8");
  45. res.on("data", function(chunk) {
  46. response += chunk;
  47. });
  48. res.on("end", function() {
  49. if (res.statusCode !== 200) {
  50. var message;
  51. if (res.headers["content-type"].indexOf("json") !== -1) {
  52. response = JSON.parse(response);
  53. message = response.message;
  54. if (response.errors && response.errors.length) {
  55. message += " - " + response.errors.map(function(error) {
  56. return "`" + error.field + "` " + error.code;
  57. }).join(", ");
  58. }
  59. } else {
  60. message = response;
  61. }
  62. if (!message && res.statusCode === 403) {
  63. message = "Forbidden";
  64. }
  65. fn(new Error(message));
  66. } else {
  67. fn(null, JSON.parse(response));
  68. }
  69. });
  70. });
  71. req.on("error", fn);
  72. if (data) {
  73. req.write(data);
  74. }
  75. req.end();
  76. };
  77. module.exports = BaseClient;