Refactor static file handler
This commit is contained in:
		
							parent
							
								
									21a3c6ad3c
								
							
						
					
					
						commit
						e4da65f1f2
					
				
					 4 changed files with 12 additions and 34 deletions
				
			
		|  | @ -17,7 +17,7 @@ at_exit do | |||
|   config = Kemal.config | ||||
|   logger = Kemal::Logger.new | ||||
|   config.add_handler logger | ||||
|   config.add_handler Kemal::StaticHandler.new("./public") | ||||
|   config.add_handler Kemal::StaticFileHandler.new("./public") | ||||
|   config.add_handler Kemal::Handler::INSTANCE | ||||
| 
 | ||||
|   server = HTTP::Server.new(config.port, config.handlers) | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| macro redirect(url) | ||||
|   env.response.headers.add "Location", {{url}} | ||||
|   env.response.status_code = 301 | ||||
| end | ||||
| end | ||||
|  |  | |||
							
								
								
									
										10
									
								
								src/kemal/static_file_handler.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/kemal/static_file_handler.cr
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| require "http/server" | ||||
| require "ecr/macros" | ||||
| 
 | ||||
| class Kemal::StaticFileHandler < HTTP::Handler | ||||
|   def call(request) | ||||
|     request_path = request.path.not_nil! | ||||
|     return call_next(request) if request_path == "/" | ||||
|     super | ||||
|   end | ||||
| end | ||||
|  | @ -1,32 +0,0 @@ | |||
| require "http/server" | ||||
| require "ecr/macros" | ||||
| 
 | ||||
| class Kemal::StaticHandler < HTTP::Handler | ||||
| 
 | ||||
|   def initialize(@publicdir) | ||||
|   end | ||||
| 
 | ||||
|   def call(request) | ||||
|     request_path = request.path.not_nil! | ||||
| 
 | ||||
|     # Call next handler for processing | ||||
|     return call_next(request) unless request_path.starts_with? "/public" | ||||
|     file = request_path.split("/public/")[1] if request_path.starts_with?("/public") | ||||
|     file_path = File.expand_path("public/#{file}", Dir.working_directory) | ||||
|     if File.exists?(file_path) | ||||
|       HTTP::Response.new(200, File.read(file_path), HTTP::Headers{"Content-Type": mime_type(file_path)}) | ||||
|     else | ||||
|       call_next(request) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private def mime_type(path) | ||||
|     case File.extname(path) | ||||
|     when ".txt"          then "text/plain" | ||||
|     when ".htm", ".html" then "text/html" | ||||
|     when ".css"          then "text/css" | ||||
|     when ".js"           then "application/javascript" | ||||
|     else                      "application/octet-stream" | ||||
|     end | ||||
|   end | ||||
| end | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue