socketioMEANseed/server/node_modules/parseurl/index.js
server/node_modules/parseurl/index.jsRaw
1/*!
2 * parseurl
3 * Copyright(c) 2014 Jonathan Ong
4 * Copyright(c) 2014 Douglas Christopher Wilson
5 * MIT Licensed
6 */
7
8'use strict'
9
10/**
11 * Module dependencies.
12 */
13
14var url = require('url')
15var parse = url.parse
16var Url = url.Url
17
18/**
19 * Pattern for a simple path case.
20 * See: https://github.com/joyent/node/pull/7878
21 */
22
23var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/
24
25/**
26 * Exports.
27 */
28
29module.exports = parseurl
30module.exports.original = originalurl
31
32/**
33 * Parse the `req` url with memoization.
34 *
35 * @param {ServerRequest} req
36 * @return {Object}
37 * @api public
38 */
39
40function parseurl(req) {
41 var url = req.url
42
43 if (url === undefined) {
44 // URL is undefined
45 return undefined
46 }
47
48 var parsed = req._parsedUrl
49
50 if (fresh(url, parsed)) {
51 // Return cached URL parse
52 return parsed
53 }
54
55 // Parse the URL
56 parsed = fastparse(url)
57 parsed._raw = url
58
59 return req._parsedUrl = parsed
60};
61
62/**
63 * Parse the `req` original url with fallback and memoization.
64 *
65 * @param {ServerRequest} req
66 * @return {Object}
67 * @api public
68 */
69
70function originalurl(req) {
71 var url = req.originalUrl
72
73 if (typeof url !== 'string') {
74 // Fallback
75 return parseurl(req)
76 }
77
78 var parsed = req._parsedOriginalUrl
79
80 if (fresh(url, parsed)) {
81 // Return cached URL parse
82 return parsed
83 }
84
85 // Parse the URL
86 parsed = fastparse(url)
87 parsed._raw = url
88
89 return req._parsedOriginalUrl = parsed
90};
91
92/**
93 * Parse the `str` url with fast-path short-cut.
94 *
95 * @param {string} str
96 * @return {Object}
97 * @api private
98 */
99
100function fastparse(str) {
101 // Try fast path regexp
102 // See: https://github.com/joyent/node/pull/7878
103 var simplePath = typeof str === 'string' && simplePathRegExp.exec(str)
104
105 // Construct simple URL
106 if (simplePath) {
107 var pathname = simplePath[1]
108 var search = simplePath[2] || null
109 var url = Url !== undefined
110 ? new Url()
111 : {}
112 url.path = str
113 url.href = str
114 url.pathname = pathname
115 url.search = search
116 url.query = search && search.substr(1)
117
118 return url
119 }
120
121 return parse(str)
122}
123
124/**
125 * Determine if parsed is still fresh for url.
126 *
127 * @param {string} url
128 * @param {object} parsedUrl
129 * @return {boolean}
130 * @api private
131 */
132
133function fresh(url, parsedUrl) {
134 return typeof parsedUrl === 'object'
135 && parsedUrl !== null
136 && (Url === undefined || parsedUrl instanceof Url)
137 && parsedUrl._raw === url
138}