| 'use strict'; |
| |
| // originally parseUri 1.2.2, now patched by us |
| // (c) Steven Levithan <stevenlevithan.com> |
| // MIT License |
| var options = { |
| strictMode: false, |
| key: ["source", "protocol", "authority", "userInfo", "user", "password", |
| "host", "port", "relative", "path", "directory", "file", "query", |
| "anchor"], |
| q: { |
| name: "queryKey", |
| parser: /(?:^|&)([^&=]*)=?([^&]*)/g |
| }, |
| parser: { |
| /* jshint maxlen: false */ |
| strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, |
| loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ |
| } |
| }; |
| function parseUri(str) { |
| var o = options; |
| var m = o.parser[o.strictMode ? "strict" : "loose"].exec(str); |
| var uri = {}; |
| var i = 14; |
| |
| while (i--) { |
| var key = o.key[i]; |
| var value = m[i] || ""; |
| var encoded = ['user', 'password'].indexOf(key) !== -1; |
| uri[key] = encoded ? decodeURIComponent(value) : value; |
| } |
| |
| uri[o.q.name] = {}; |
| uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { |
| if ($1) { |
| uri[o.q.name][$1] = $2; |
| } |
| }); |
| |
| return uri; |
| } |
| |
| |
| module.exports = parseUri; |