// Appium webserver controller methods
// https://github.com/hugs/appium/blob/master/appium/server.py
"use strict";
var status = require('./status.js')
, logger = require('./logger.js').get('appium')
, _ = require('underscore')
, _s = require("underscore.string")
, swig = require('swig')
, path = require('path')
, version = require('../../package.json').version
, proxy = require('./proxy.js')
, responses = require('./responses.js')
, getResponseHandler = responses.getResponseHandler
, respondError = responses.respondError
, respondSuccess = responses.respondSuccess
, checkMissingParams = responses.checkMissingParams
, notYetImplemented = responses.notYetImplemented
, hasValue = require('appium-support').util.hasValue
, helpers = require('../helpers.js')
, logCustomDeprecationWarning = helpers.logCustomDeprecationWarning
, safely = require('./helpers.js').safely
, NotImplementedError = require('./errors').NotImplementedError;
exports.getGlobalBeforeFilter = function (appium) {
return function (req, res, next) {
req.appium = appium;
req.device = appium.device;
if (proxy.shouldProxy(req)) {
if (req.appium.commandTimeout) {
// if we're proxying, we never get into the sessionBeforeFilter,
// so let's make sure to reset the timeout on every request still
req.appium.resetTimeout();
}
if (typeof req.device.translatePath !== "undefined") {
req.device.translatePath(req);
}
proxy.doProxy(req, res, next);
} else {
next();
}
};
};
exports.sessionBeforeFilter = function (req, res, next) {
var match = new RegExp("([^/]+)").exec(req.params[0]);
var sessId = match ? match[1] : null;
if (req.appium.commandTimeout) {
req.appium.resetTimeout();
}
// if we don't actually have a valid session, respond with an error
if (sessId && (!req.device || req.appium.sessionId !== sessId)) {
safely(req, function () {
res.status(404).send({sessionId: null, status: status.codes.NoSuchDriver.code, value: ''});
});
} else {
next();
}
};
exports.getStatus = function (req, res) {
// Return a static JSON object to the client
var gitSha = req.appium.serverConfig['git-sha'];
var data = {build: {version: version}};
if (typeof gitSha !== "undefined") {
data.build.revision = gitSha;
}
if (req.device && typeof req.device.getStatusExtensions === "function") {
data = _.extend(data, req.device.getStatusExtensions());
}
respondSuccess(req, res, data);
};
exports.installApp = function (req, res) {
var install = function (appPath) {
req.device.installApp(appPath, function (error, response) {
if (error !== null) {
respondError(req, res, error);
} else {
respondSuccess(req, res, response);
}
});
};
if (typeof req.body.appPath !== "undefined") {
req.device.unpackApp(req, function (unpackedAppPath) {
if (unpackedAppPath === null) {
respondError(req, res, 'Only a (zipped) app/apk files can be installed using this endpoint');
} else {
install(unpackedAppPath);
}
});
} else if (typeof req.device.args.app !== "undefined") {
install(req.device.args.app);
} else {
respondError(req, res, "No app defined (either through desired capabilities or as an argument)");
}
};
exports.removeApp = function (req, res) {
req.body.appId = req.body.appId || req.body.bundleId;
if (checkMissingParams(req, res, {appId: req.body.appId}, true)) {
req.device.removeApp(req.body.appId, function (error, response) {
if (error !== null) {
respondError(req, res, response);
} else {
respondSuccess(req, res, response);
}
});
}
};