OpenVeo Core server

API Docs for: 7.0.0
Show:

File: app/server/path.js

'use strict';

/**
 * @module core
 */

/**
 * Provides functions to manipulate HTTP paths handled by the server.
 *
 * @class path
 * @static
 */

/**
 * Validates a path regarding a rule.
 *
 * @example
 *     var path = process.require("app/server/path.js");
 *     path.validate("get /test", "get /test"); // true
 *     path.validate("get /test", "/test"); // true
 *     path.validate("get /test", "/*"); // true
 *     path.validate("get /test", "*"); // true
 *     path.validate("post /test", "post /test"); // true
 *     path.validate("put /test", "put /test"); // true
 *     path.validate("delete /test", "delete /test"); // true
 *     path.validate("/test", "/test"); // true
 *     path.validate("get /test", ""); // false
 *     path.validate("get /test", "/"); // false
 *     path.validate("get /test", "/other"); // false
 *     path.validate("get /test", "post /test"); // false
 *     path.validate("get /test", "post"); // false
 *     path.validate("get /test", "get"); // false
 *     path.validate("get /test", "unknwon /test"); // false
 *
 * @method validate
 * @static
 * @param {String} path The path to validate
 * @param String rule The rule to validate path
 * @return {Boolean} true if the rule validates the path, false
 * otherwise
 */
module.exports.validate = function(path, rule) {
  if (path && rule) {
    path = path.toLowerCase();
    rule = rule.toLowerCase();

    // Path and rule are identical, not need to go further
    if (path === rule)
      return true;

    // e.g. get /publish/videos
    // Extract HTTP method and path ("get" and "/publish/videos")
    var ruleChunks = /^(get|post|delete|put)? ?(\/?.*)$/.exec(rule);

    // Got a rule
    if (ruleChunks && ruleChunks[2]) {
      var pattern;

      // Transform rule to be used as regular expression pattern
      // Firstly replace all * characters by .*
      // Secondly replace all parameters (e.g. :id) by [^/]+
      // Thirdly escape all slashes
      var rulePattern = ruleChunks[2].replace(/\*/g, '.*').replace(/:[^/]*/g, '[^/]+').replace(/\//g, '\\/');

      // Got HTTP method in rule
      if (ruleChunks[1])
        pattern = new RegExp('^' + ruleChunks[1] + ' ' + rulePattern + '$');

      // No HTTP method in rule, authorize get, post, delete and put
      else
        pattern = new RegExp('^(get|post|delete|put)? ?' + rulePattern + '$');

      if (pattern.test(path))
        return true;
    }
  }

  return false;
};