Also actual files for the previous commit (how did i forget to do that)
This commit is contained in:
		
							parent
							
								
									8894a9a55f
								
							
						
					
					
						commit
						9c9ceaf4f8
					
				|  | @ -21,16 +21,13 @@ module Hyde | |||
|       # Set root path (appends matched part of the path). | ||||
|       # @param path [String | ||||
|       def root(path) | ||||
|         raise StandardError, "path should be a String" unless path.is_a? String | ||||
| 
 | ||||
|         @origin.root = path | ||||
|       end | ||||
| 
 | ||||
|       # Set root path (without appending matched part). | ||||
|       # @param path [String | ||||
|       def remap(path) | ||||
|         root(path) | ||||
|         @origin.remap = true | ||||
|         @origin.remap = path | ||||
|       end | ||||
| 
 | ||||
|       # Add a preprocessor to the path. | ||||
|  |  | |||
|  | @ -9,12 +9,29 @@ module Hyde | |||
|   # @abstract | ||||
|   class Node | ||||
|     # @param path [Object] | ||||
|     def initialize(path) | ||||
|     def initialize(path, parent:) | ||||
|       @pattern = Pattern.new(path).freeze | ||||
|       @properties = Hyde::Util::Lookup.new(parent&.properties) | ||||
|       @root = nil | ||||
|       @remap = false | ||||
|     end | ||||
| 
 | ||||
|     # Set Node file root (like root in Nginx) | ||||
|     # @param path [String] | ||||
|     def root=(path) | ||||
|       raise StandardError, "path should be a String" unless path.is_a? String | ||||
| 
 | ||||
|       @properties["path"] = File.expand_path(path) | ||||
|       @root = File.expand_path(path) | ||||
|     end | ||||
| 
 | ||||
|     # Set Node absolute file path (like alias in Nginx) | ||||
|     # @param path [String] | ||||
|     def remap=(path) | ||||
|       self.root = path | ||||
|       @remap = true | ||||
|     end | ||||
| 
 | ||||
|     # Try to navigate the path. Run method callback in response. | ||||
|     # @param [Hyde::Request] | ||||
|     # @return [Boolean] | ||||
|  | @ -49,7 +66,7 @@ module Hyde | |||
|       true | ||||
|     end | ||||
| 
 | ||||
|     attr_accessor :remap, :root | ||||
|     attr_reader :remap, :root | ||||
| 
 | ||||
|     private | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,11 +25,9 @@ module Hyde | |||
|     # @param parent [Hyde::Node] Parent object to inherit properties to | ||||
|     # @param setup [#call] Setup block | ||||
|     def initialize(path, parent:, &setup) | ||||
|       super(path) | ||||
|       super(path, parent: parent) | ||||
|       # Child nodes array | ||||
|       @children = [] | ||||
|       # Inherited properties array | ||||
|       @properties = Hyde::Util::Lookup.new(parent&.properties) | ||||
|       # Arrays of preprocessors, postprocessors and filters | ||||
|       @preprocessors = [] | ||||
|       @postprocessors = [] | ||||
|  |  | |||
|  | @ -100,11 +100,12 @@ module Hyde | |||
| 
 | ||||
|       private | ||||
| 
 | ||||
|       # i shall name thee Norxondor Glorbulon | ||||
| 
 | ||||
|       # Regexp pattern to match glob tokens | ||||
|       TOKENS = / | ||||
|         ( # Glob-specific tokens | ||||
|           \/\*\*\/ |                      # Freestanding globstar | ||||
|           \*\* |                          # Attached globstar | ||||
|           (?<=(?:\/|^))\*\*(?:\/|$) |     # Freestanding globstar | ||||
|           \* |                            # Regular glob | ||||
|           \[!?\w-\w\]\+ |                 # Character group | ||||
|           (?<=\/):[\w_]+(?=(?:\/|$)) |    # Named glob | ||||
|  | @ -153,8 +154,7 @@ module Hyde | |||
|       def build_regexp(tokens) | ||||
|         Regexp.new(tokens.map do |filter| | ||||
|           case filter | ||||
|           when "/**/" then "/(?:(.*)\/|)" # FIXME: this may return nil | ||||
|           when "**" then "(.*)" | ||||
|           when /(\/|^)\*\*(\/|$)/ then "(?:(.*)/|)" # FIXME: this may return nil | ||||
|           when "*" then "([^/]*)" | ||||
|           when /^\([\w\/|_-]+\)$/ then filter.sub('-', '\\-') | ||||
|           when /^\[!?\w-\w\]\+$/ then filter.sub('!', '^') | ||||
|  |  | |||
|  | @ -21,8 +21,7 @@ module Hyde | |||
|     # @param path [Object] | ||||
|     # @param parent [Hyde::Node] | ||||
|     def initialize(path, parent:) | ||||
|       super(path) | ||||
|       @properties = Hyde::Util::Lookup.new(parent&.properties) | ||||
|       super(path, parent: parent) | ||||
|     end | ||||
| 
 | ||||
|     attr_reader :properties | ||||
|  |  | |||
|  | @ -20,7 +20,10 @@ module Hyde | |||
|     # @param request [Hyde::Request] | ||||
|     # @return [Boolean] true if file was found | ||||
|     def process(request) | ||||
|       File.open(request.filepath.delete_suffix("/")) | ||||
|       path = File.expand_path(request.filepath) | ||||
|       return unless path.start_with? @properties["path"] | ||||
| 
 | ||||
|       File.open(path.delete_suffix("/")) | ||||
|     rescue StandardError | ||||
|       false | ||||
|     end | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ module Hyde | |||
|       @param = {} | ||||
|       @splat = [] | ||||
|       # Traversal route. Public and writable. | ||||
|       @path = env["PATH_INFO"].dup | ||||
|       @path = URI.decode_www_form_component(env["PATH_INFO"].dup) | ||||
|       # File serving path. Public and writable. | ||||
|       @filepath = "/" | ||||
|       # Encapsulates all rack variables. Should not be public. | ||||
|  |  | |||
|  | @ -28,10 +28,9 @@ module Hyde | |||
|             "content-type": "text/html" | ||||
|           } | ||||
|           [headers, page] | ||||
|         end | ||||
|       }.each do |k, v| | ||||
|         @properties[k] = v unless @properties[k] | ||||
|       end | ||||
|         end, | ||||
|         "path" => "/" | ||||
|       }.each { |k, v| @properties[k] = v unless @properties[k] } | ||||
|     end | ||||
| 
 | ||||
|     # Rack ingress point. | ||||
|  |  | |||
|  | @ -69,6 +69,27 @@ class TestGlob < Test::Unit::TestCase | |||
|       puts("Testing: #{test}") | ||||
|       assert_equal(result, unit.match?(test)) | ||||
|     end | ||||
|     unit = Glob.new("**/*.php") | ||||
|     [ | ||||
|       "archive.php", true, | ||||
|       "assets/thing.js", false, | ||||
|       "assetsthing.js", false, | ||||
|       "parts/thing.php", true, | ||||
|       "partsthing.php", true, | ||||
|       ".php", true, | ||||
|       "parts/extra/test.php", true, | ||||
|       "archive.php", true, | ||||
|       "assets/thing.js", false, | ||||
|       "assetsthing.js", false, | ||||
|       "parts/thing.php", true, | ||||
|       "partsthing.php", true, | ||||
|       ".php", true, | ||||
|       "parts/extra/test.php", true, | ||||
|       "parts/extra/test.php/literally/anything/here", true | ||||
|     ].each_slice(2) do |test, result| | ||||
|       puts("Testing: #{test}") | ||||
|       assert_equal(result, unit.match?(test)) | ||||
|     end | ||||
|     puts "Test group: char ranges" | ||||
|     unit = Glob.new("/test/[9-z]+") | ||||
|     [ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue