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