101 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| function isDirectoryIndex(resource, options)
 | |
| {
 | |
| 	var verdict = false;
 | |
| 	
 | |
| 	options.directoryIndexes.every( function(index)
 | |
| 	{
 | |
| 		if (index === resource)
 | |
| 		{
 | |
| 			verdict = true;
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		return true;
 | |
| 	});
 | |
| 	
 | |
| 	return verdict;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| function parsePath(urlObj, options)
 | |
| {
 | |
| 	var path = urlObj.path.absolute.string;
 | |
| 	
 | |
| 	if (path)
 | |
| 	{
 | |
| 		var lastSlash = path.lastIndexOf("/");
 | |
| 		
 | |
| 		if (lastSlash > -1)
 | |
| 		{
 | |
| 			if (++lastSlash < path.length)
 | |
| 			{
 | |
| 				var resource = path.substr(lastSlash);
 | |
| 				
 | |
| 				if (resource!=="." && resource!=="..")
 | |
| 				{
 | |
| 					urlObj.resource = resource;
 | |
| 					path = path.substr(0, lastSlash);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					path += "/";
 | |
| 				}
 | |
| 			}
 | |
| 			
 | |
| 			urlObj.path.absolute.string = path;
 | |
| 			urlObj.path.absolute.array = splitPath(path);
 | |
| 		}
 | |
| 		else if (path==="." || path==="..")
 | |
| 		{
 | |
| 			// "..?var", "..#anchor", etc ... not "..index.html"
 | |
| 			path += "/";
 | |
| 			
 | |
| 			urlObj.path.absolute.string = path;
 | |
| 			urlObj.path.absolute.array = splitPath(path);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			// Resource-only
 | |
| 			urlObj.resource = path;
 | |
| 			urlObj.path.absolute.string = null;
 | |
| 		}
 | |
| 		
 | |
| 		urlObj.extra.resourceIsIndex = isDirectoryIndex(urlObj.resource, options);
 | |
| 	}
 | |
| 	// Else: query/hash-only or empty
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| function splitPath(path)
 | |
| {
 | |
| 	// TWEAK :: condition only for speed optimization
 | |
| 	if (path !== "/")
 | |
| 	{
 | |
| 		var cleaned = [];
 | |
| 		
 | |
| 		path.split("/").forEach( function(dir)
 | |
| 		{
 | |
| 			// Cleanup -- splitting "/dir/" becomes ["","dir",""]
 | |
| 			if (dir !== "")
 | |
| 			{
 | |
| 				cleaned.push(dir);
 | |
| 			}
 | |
| 		});
 | |
| 		
 | |
| 		return cleaned;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		// Faster to skip the above block and just create an array
 | |
| 		return [];
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| module.exports = parsePath;
 |