client.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. Buffer.from(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) {
  55. if (Array.isArray(response.errors) && response.errors.length) {
  56. message += " - " + response.errors.map(function(error) {
  57. return "`" + error.field + "` " + error.code;
  58. }).join(", ");
  59. } else {
  60. message += " - " + response.errors.toString();
  61. }
  62. }
  63. } else {
  64. message = response;
  65. }
  66. if (!message && res.statusCode === 403) {
  67. message = "Forbidden";
  68. }
  69. fn(new Error(message));
  70. } else {
  71. fn(null, JSON.parse(response));
  72. }
  73. });
  74. });
  75. req.on("error", fn);
  76. if (data) {
  77. req.write(data);
  78. }
  79. req.end();
  80. };
  81. module.exports = BaseClient;