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