Add URL encoding and decoding to the path and other components
This commit is contained in:
		
							parent
							
								
									3eab1bfc1a
								
							
						
					
					
						commit
						9cc4a320c2
					
				
							
								
								
									
										12
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										12
									
								
								CHANGELOG.md
								
								
								
								
							| 
						 | 
					@ -1,5 +1,17 @@
 | 
				
			||||||
# Jetforce Changelog
 | 
					# Jetforce Changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### v0.3.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Bugfixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- The static file server will now URL-encode spaces (%20) and other reserved
 | 
				
			||||||
 | 
					  characters in filenames.
 | 
				
			||||||
 | 
					- The ``Request`` class will now apply URL decoding to the following components
 | 
				
			||||||
 | 
					  of the request, in addition to the query params:
 | 
				
			||||||
 | 
					  - ``request.path``
 | 
				
			||||||
 | 
					  - ``request.params``
 | 
				
			||||||
 | 
					  - ``request.fragment``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### v0.3.1
 | 
					### v0.3.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Bugfixes
 | 
					#### Bugfixes
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ import argparse
 | 
				
			||||||
import dataclasses
 | 
					import dataclasses
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
import typing
 | 
					import typing
 | 
				
			||||||
import urllib.parse
 | 
					from urllib.parse import unquote, urlparse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from twisted.internet.defer import Deferred
 | 
					from twisted.internet.defer import Deferred
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ class Request:
 | 
				
			||||||
        self.environ = environ
 | 
					        self.environ = environ
 | 
				
			||||||
        self.url = environ["GEMINI_URL"]
 | 
					        self.url = environ["GEMINI_URL"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        url_parts = urllib.parse.urlparse(self.url)
 | 
					        url_parts = urlparse(self.url)
 | 
				
			||||||
        if not url_parts.hostname:
 | 
					        if not url_parts.hostname:
 | 
				
			||||||
            raise ValueError("URL must contain a `hostname` part")
 | 
					            raise ValueError("URL must contain a `hostname` part")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,10 +63,11 @@ class Request:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.hostname = url_parts.hostname
 | 
					        self.hostname = url_parts.hostname
 | 
				
			||||||
        self.port = url_parts.port
 | 
					        self.port = url_parts.port
 | 
				
			||||||
        self.path = url_parts.path
 | 
					
 | 
				
			||||||
        self.params = url_parts.params
 | 
					        self.path = unquote(url_parts.path)
 | 
				
			||||||
        self.query = urllib.parse.unquote(url_parts.query)
 | 
					        self.params = unquote(url_parts.params)
 | 
				
			||||||
        self.fragment = url_parts.fragment
 | 
					        self.query = unquote(url_parts.query)
 | 
				
			||||||
 | 
					        self.fragment = unquote(url_parts.fragment)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@dataclasses.dataclass
 | 
					@dataclasses.dataclass
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,10 +174,12 @@ class StaticDirectoryApplication(JetforceApplication):
 | 
				
			||||||
            if file.name.startswith("."):
 | 
					            if file.name.startswith("."):
 | 
				
			||||||
                # Skip hidden directories/files that may contain sensitive info
 | 
					                # Skip hidden directories/files that may contain sensitive info
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            elif file.is_dir():
 | 
					
 | 
				
			||||||
                yield f"=>/{url_path / file.name}/\t{file.name}/\r\n".encode()
 | 
					            encoded_path = urllib.parse.quote(str(url_path / file.name))
 | 
				
			||||||
 | 
					            if file.is_dir():
 | 
				
			||||||
 | 
					                yield f"=>/{encoded_path}/\t{file.name}/\r\n".encode()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                yield f"=>/{url_path / file.name}\t{file.name}\r\n".encode()
 | 
					                yield f"=>/{encoded_path}\t{file.name}\r\n".encode()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def guess_mimetype(self, filename: str) -> str:
 | 
					    def guess_mimetype(self, filename: str) -> str:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue