All files / agent url.js

10% Statements 3/30
0% Branches 0/20
0% Functions 0/6
10% Lines 3/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96    1x 1x                                                                                                         1x                                                                              
"use strict";
 
const _ = require("lodash");
const { URL } = require("url");
 
/**
 * Add addtional search part to the url
 *
 * @example
 *
 * let updatedUrl = appendSearch("https://localhost/", "foo=2");
 * updatedUrl === "https://localhost/?foo=2";
 *
 * @param {String} inputUrl url for adding new search parameters
 * @param {String} additionalSearch string which contains search parameters for adding
 *
 * @return {String} updated url
 */
function appendSearch(inputUrl, additionalSearch) {
  let url = new URL(inputUrl);
  if (!_.isString(additionalSearch)) {
    throw new Error(
      `Invalid additionalSearch parameter ${additionalSearch} to append search.`
    );
  }
 
  if (additionalSearch) {
    let searchPrefix = url.search ? url.search + "&" : "?";
    url.search = searchPrefix + additionalSearch;
  }
 
  return url.toString();
}
 
/**
 * Append "/" to the beginning of the  path (could be
 * use out of url handling also)
 *
 * @example
 *
 * absolutizePath("foo");  //=> "/foo"
 * absolutizePath("/foo/bar");  //=> "/foo/bar"
 * absolutizePath("//foo/bar");  //=> "/foo/bar"
 *
 * @param {String} path content
 *
 * @return {String} absolutized path
 */
function absolutizePath(path) {
  var retval = path;
  if (_.isString(path)) {
    retval = "/" + path.replace(/^\/*/, "");
  }
  return retval;
}
 
module.exports = {
  base(inputUrl) {
    var url = new URL(inputUrl);
    return `${url.protocol}//${url.host}${
      !url.pathname || url.pathname === "/" ? "/" : absolutizePath(url.pathname)
    }`;
  },
  normalize(input, base) {
    var urlBase = new URL(base);
    var urlInput = new URL(input, base);
    var basePath = urlBase.pathname;
    var inputPath = urlInput.pathname;
 
    if (
      _.isString(basePath) &&
      basePath.substring(basePath.length - 1) === "/"
    ) {
      basePath = basePath.substring(0, basePath.length - 1);
    }
 
    if (_.isString(inputPath) && inputPath.substring(0, 1) === "/") {
      inputPath = inputPath.substring(1);
    }
 
    urlInput.pathname = basePath + "/" + inputPath;
 
    return urlInput.href;
  },
  username(inputUrl) {
    var url = new URL(inputUrl);
    return url.username;
  },
  password(inputUrl) {
    var url = new URL(inputUrl);
    return url.password;
  },
  appendSearch: appendSearch,
  absolutizePath: absolutizePath,
};