aboutsummaryrefslogtreecommitdiffhomepage
path: root/node_modules/parseurl/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/parseurl/index.js')
-rw-r--r--node_modules/parseurl/index.js154
1 files changed, 154 insertions, 0 deletions
diff --git a/node_modules/parseurl/index.js b/node_modules/parseurl/index.js
new file mode 100644
index 0000000..603eabe
--- /dev/null
+++ b/node_modules/parseurl/index.js
@@ -0,0 +1,154 @@
+/*!
+ * parseurl
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2014-2017 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var url = require('url')
+var parse = url.parse
+var Url = url.Url
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = parseurl
+module.exports.original = originalurl
+
+/**
+ * Parse the `req` url with memoization.
+ *
+ * @param {ServerRequest} req
+ * @return {Object}
+ * @public
+ */
+
+function parseurl (req) {
+ var url = req.url
+
+ if (url === undefined) {
+ // URL is undefined
+ return undefined
+ }
+
+ var parsed = req._parsedUrl
+
+ if (fresh(url, parsed)) {
+ // Return cached URL parse
+ return parsed
+ }
+
+ // Parse the URL
+ parsed = fastparse(url)
+ parsed._raw = url
+
+ return (req._parsedUrl = parsed)
+};
+
+/**
+ * Parse the `req` original url with fallback and memoization.
+ *
+ * @param {ServerRequest} req
+ * @return {Object}
+ * @public
+ */
+
+function originalurl (req) {
+ var url = req.originalUrl
+
+ if (typeof url !== 'string') {
+ // Fallback
+ return parseurl(req)
+ }
+
+ var parsed = req._parsedOriginalUrl
+
+ if (fresh(url, parsed)) {
+ // Return cached URL parse
+ return parsed
+ }
+
+ // Parse the URL
+ parsed = fastparse(url)
+ parsed._raw = url
+
+ return (req._parsedOriginalUrl = parsed)
+};
+
+/**
+ * Parse the `str` url with fast-path short-cut.
+ *
+ * @param {string} str
+ * @return {Object}
+ * @private
+ */
+
+function fastparse (str) {
+ if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) {
+ return parse(str)
+ }
+
+ var pathname = str
+ var query = null
+ var search = null
+
+ // This takes the regexp from https://github.com/joyent/node/pull/7878
+ // Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/
+ // And unrolls it into a for loop
+ for (var i = 1; i < str.length; i++) {
+ switch (str.charCodeAt(i)) {
+ case 0x3f: /* ? */
+ if (search === null) {
+ pathname = str.substring(0, i)
+ query = str.substring(i + 1)
+ search = str.substring(i)
+ }
+ break
+ case 0x09: /* \t */
+ case 0x0a: /* \n */
+ case 0x0c: /* \f */
+ case 0x0d: /* \r */
+ case 0x20: /* */
+ case 0x23: /* # */
+ case 0xa0:
+ case 0xfeff:
+ return parse(str)
+ }
+ }
+
+ var url = Url !== undefined
+ ? new Url()
+ : {}
+ url.path = str
+ url.href = str
+ url.pathname = pathname
+ url.query = query
+ url.search = search
+
+ return url
+}
+
+/**
+ * Determine if parsed is still fresh for url.
+ *
+ * @param {string} url
+ * @param {object} parsedUrl
+ * @return {boolean}
+ * @private
+ */
+
+function fresh (url, parsedUrl) {
+ return typeof parsedUrl === 'object' &&
+ parsedUrl !== null &&
+ (Url === undefined || parsedUrl instanceof Url) &&
+ parsedUrl._raw === url
+}