Force directory paths to end with a trailing slash
This commit is contained in:
		
							parent
							
								
									c626494bfc
								
							
						
					
					
						commit
						371b7dd01d
					
				| 
						 | 
					@ -1,5 +1,10 @@
 | 
				
			||||||
# Jetforce Changelog
 | 
					# Jetforce Changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Unreleased
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Force URLs to always end in trailing slashes when serving a directory. This
 | 
				
			||||||
 | 
					  reduces duplicate selectors and makes resolving relative links more reliable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### v0.0.7 (2019-08-30)
 | 
					### v0.0.7 (2019-08-30)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Added support for a primitive version of CGI scripting.
 | 
					- Added support for a primitive version of CGI scripting.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										19
									
								
								jetforce.py
								
								
								
								
							
							
						
						
									
										19
									
								
								jetforce.py
								
								
								
								
							| 
						 | 
					@ -235,20 +235,23 @@ class StaticDirectoryApplication(JetforceApplication):
 | 
				
			||||||
            if is_cgi and is_exe:
 | 
					            if is_cgi and is_exe:
 | 
				
			||||||
                return self.run_cgi_script(filesystem_path, request.environ)
 | 
					                return self.run_cgi_script(filesystem_path, request.environ)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            mimetype = self.guess_mimetype(filesystem_path.name)
 | 
				
			||||||
                mimetype = self.guess_mimetype(filesystem_path.name)
 | 
					            generator = self.load_file(filesystem_path)
 | 
				
			||||||
                generator = self.load_file(filesystem_path)
 | 
					            return Response(Status.SUCCESS, mimetype, generator)
 | 
				
			||||||
                return Response(Status.SUCCESS, mimetype, generator)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif filesystem_path.is_dir():
 | 
					        elif filesystem_path.is_dir():
 | 
				
			||||||
 | 
					            if request.path and not request.path.endswith("/"):
 | 
				
			||||||
 | 
					                url_parts = urllib.parse.urlparse(request.url)
 | 
				
			||||||
 | 
					                url_parts = url_parts._replace(path=request.path + "/")
 | 
				
			||||||
 | 
					                return Response(Status.REDIRECT_PERMANENT, url_parts.geturl())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            index_file = filesystem_path / self.index_file
 | 
					            index_file = filesystem_path / self.index_file
 | 
				
			||||||
            if index_file.exists():
 | 
					            if index_file.exists():
 | 
				
			||||||
                generator = self.load_file(index_file)
 | 
					                generator = self.load_file(index_file)
 | 
				
			||||||
                return Response(Status.SUCCESS, "text/gemini", generator)
 | 
					                return Response(Status.SUCCESS, "text/gemini", generator)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            generator = self.list_directory(url_path, filesystem_path)
 | 
				
			||||||
                generator = self.list_directory(url_path, filesystem_path)
 | 
					            return Response(Status.SUCCESS, "text/gemini", generator)
 | 
				
			||||||
                return Response(Status.SUCCESS, "text/gemini", generator)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return Response(Status.NOT_FOUND, "Not Found")
 | 
					            return Response(Status.NOT_FOUND, "Not Found")
 | 
				
			||||||
| 
						 | 
					@ -310,7 +313,7 @@ class StaticDirectoryApplication(JetforceApplication):
 | 
				
			||||||
                # Skip hidden and temporary files for security reasons
 | 
					                # Skip hidden and temporary files for security reasons
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            elif file.is_dir():
 | 
					            elif file.is_dir():
 | 
				
			||||||
                yield f"=>/{url_path / file.name}\t{file.name}/\r\n".encode()
 | 
					                yield f"=>/{url_path / file.name}/\t{file.name}/\r\n".encode()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                yield f"=>/{url_path / file.name}\t{file.name}\r\n".encode()
 | 
					                yield f"=>/{url_path / file.name}\t{file.name}\r\n".encode()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue