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;
 |