You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
2.3 KiB
147 lines
2.3 KiB
4 weeks ago
|
"use strict";
|
||
|
|
||
|
var _parseUrl = require("url").parse;
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
Customize the URL object that Node generates
|
||
|
because:
|
||
|
|
||
|
* necessary data for later
|
||
|
* urlObj.host is useless
|
||
|
* urlObj.hostname is too long
|
||
|
* urlObj.path is useless
|
||
|
* urlObj.pathname is too long
|
||
|
* urlObj.protocol is inaccurate; should be called "scheme"
|
||
|
* urlObj.search is mostly useless
|
||
|
*/
|
||
|
function clean(urlObj)
|
||
|
{
|
||
|
var scheme = urlObj.protocol;
|
||
|
|
||
|
if (scheme)
|
||
|
{
|
||
|
// Remove ":" suffix
|
||
|
if (scheme.indexOf(":") === scheme.length-1)
|
||
|
{
|
||
|
scheme = scheme.substr(0, scheme.length-1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
urlObj.host =
|
||
|
{
|
||
|
// TODO :: unescape(encodeURIComponent(s)) ? ... http://ecmanaut.blogspot.ca/2006/07/encoding-decoding-utf8-in-javascript.html
|
||
|
full: urlObj.hostname,
|
||
|
stripped: null
|
||
|
};
|
||
|
|
||
|
urlObj.path =
|
||
|
{
|
||
|
absolute:
|
||
|
{
|
||
|
array: null,
|
||
|
string: urlObj.pathname
|
||
|
},
|
||
|
relative:
|
||
|
{
|
||
|
array: null,
|
||
|
string: null
|
||
|
}
|
||
|
};
|
||
|
|
||
|
urlObj.query =
|
||
|
{
|
||
|
object: urlObj.query,
|
||
|
string:
|
||
|
{
|
||
|
full: null,
|
||
|
stripped: null
|
||
|
}
|
||
|
};
|
||
|
|
||
|
urlObj.extra =
|
||
|
{
|
||
|
hrefInfo:
|
||
|
{
|
||
|
minimumPathOnly: null,
|
||
|
minimumResourceOnly: null,
|
||
|
minimumQueryOnly: null,
|
||
|
minimumHashOnly: null,
|
||
|
empty: null,
|
||
|
|
||
|
separatorOnlyQuery: urlObj.search==="?"
|
||
|
},
|
||
|
portIsDefault: null,
|
||
|
relation:
|
||
|
{
|
||
|
maximumScheme: null,
|
||
|
maximumAuth: null,
|
||
|
maximumHost: null,
|
||
|
maximumPort: null,
|
||
|
maximumPath: null,
|
||
|
maximumResource: null,
|
||
|
maximumQuery: null,
|
||
|
maximumHash: null,
|
||
|
|
||
|
minimumScheme: null,
|
||
|
minimumAuth: null,
|
||
|
minimumHost: null,
|
||
|
minimumPort: null,
|
||
|
minimumPath: null,
|
||
|
minimumResource: null,
|
||
|
minimumQuery: null,
|
||
|
minimumHash: null,
|
||
|
|
||
|
overridesQuery: null
|
||
|
},
|
||
|
resourceIsIndex: null,
|
||
|
slashes: urlObj.slashes
|
||
|
};
|
||
|
|
||
|
urlObj.resource = null;
|
||
|
urlObj.scheme = scheme;
|
||
|
delete urlObj.hostname;
|
||
|
delete urlObj.pathname;
|
||
|
delete urlObj.protocol;
|
||
|
delete urlObj.search;
|
||
|
delete urlObj.slashes;
|
||
|
|
||
|
return urlObj;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
function validScheme(url, options)
|
||
|
{
|
||
|
var valid = true;
|
||
|
|
||
|
options.rejectedSchemes.every( function(rejectedScheme)
|
||
|
{
|
||
|
valid = !(url.indexOf(rejectedScheme+":") === 0);
|
||
|
|
||
|
// Break loop
|
||
|
return valid;
|
||
|
});
|
||
|
|
||
|
return valid;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
function parseUrlString(url, options)
|
||
|
{
|
||
|
if ( validScheme(url,options) )
|
||
|
{
|
||
|
return clean( _parseUrl(url, true, options.slashesDenoteHost) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return {href:url, valid:false};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
module.exports = parseUrlString;
|