147 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "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;
 |