opusdev/vector-similarity-api
1
1/*!2 * parseurl3 * Copyright(c) 2014 Jonathan Ong4 * Copyright(c) 2014-2017 Douglas Christopher Wilson5 * MIT Licensed6 */7 8'use strict'9 10/**11 * Module dependencies.12 * @private13 */14 15var url = require('url')16var parse = url.parse17var Url = url.Url18 19/**20 * Module exports.21 * @public22 */23 24module.exports = parseurl25module.exports.original = originalurl26 27/**28 * Parse the `req` url with memoization.29 *30 * @param {ServerRequest} req31 * @return {Object}32 * @public33 */34 35function parseurl (req) {36 var url = req.url37 38 if (url === undefined) {39 // URL is undefined40 return undefined41 }42 43 var parsed = req._parsedUrl44 45 if (fresh(url, parsed)) {46 // Return cached URL parse47 return parsed48 }49 50 // Parse the URL51 parsed = fastparse(url)52 parsed._raw = url53 54 return (req._parsedUrl = parsed)55};56 57/**58 * Parse the `req` original url with fallback and memoization.59 *60 * @param {ServerRequest} req61 * @return {Object}62 * @public63 */64 65function originalurl (req) {66 var url = req.originalUrl67 68 if (typeof url !== 'string') {69 // Fallback70 return parseurl(req)71 }72 73 var parsed = req._parsedOriginalUrl74 75 if (fresh(url, parsed)) {76 // Return cached URL parse77 return parsed78 }79 80 // Parse the URL81 parsed = fastparse(url)82 parsed._raw = url83 84 return (req._parsedOriginalUrl = parsed)85};86 87/**88 * Parse the `str` url with fast-path short-cut.89 *90 * @param {string} str91 * @return {Object}92 * @private93 */94 95function fastparse (str) {96 if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) {97 return parse(str)98 }99 100 var pathname = str101 var query = null102 var search = null103 104 // This takes the regexp from https://github.com/joyent/node/pull/7878105 // Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/106 // And unrolls it into a for loop107 for (var i = 1; i < str.length; i++) {108 switch (str.charCodeAt(i)) {109 case 0x3f: /* ? */110 if (search === null) {111 pathname = str.substring(0, i)112 query = str.substring(i + 1)113 search = str.substring(i)114 }115 break116 case 0x09: /* \t */117 case 0x0a: /* \n */118 case 0x0c: /* \f */119 case 0x0d: /* \r */120 case 0x20: /* */121 case 0x23: /* # */122 case 0xa0:123 case 0xfeff:124 return parse(str)125 }126 }127 128 var url = Url !== undefined129 ? new Url()130 : {}131 132 url.path = str133 url.href = str134 url.pathname = pathname135 136 if (search !== null) {137 url.query = query138 url.search = search139 }140 141 return url142}143 144/**145 * Determine if parsed is still fresh for url.146 *147 * @param {string} url148 * @param {object} parsedUrl149 * @return {boolean}150 * @private151 */152 153function fresh (url, parsedUrl) {154 return typeof parsedUrl === 'object' &&155 parsedUrl !== null &&156 (Url === undefined || parsedUrl instanceof Url) &&157 parsedUrl._raw === url158}159 