mirror of
				https://gitea.invidious.io/iv-org/shard-kemal.git
				synced 2024-08-15 00:53:36 +00:00 
			
		
		
		
	Add Kemal::OverrideMethodHandler
This commit is contained in:
		
							parent
							
								
									b389022b35
								
							
						
					
					
						commit
						3f7c8b4577
					
				
					 2 changed files with 53 additions and 0 deletions
				
			
		
							
								
								
									
										29
									
								
								spec/override_method_handler_spec.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								spec/override_method_handler_spec.cr
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | ||||||
|  | require "./spec_helper" | ||||||
|  | 
 | ||||||
|  | describe "Kemal::OverrideMethodHandler" do | ||||||
|  |   it "does not override method without _method for POST requests" do | ||||||
|  |     request = HTTP::Request.new( | ||||||
|  |       "POST", | ||||||
|  |       "/", | ||||||
|  |       body: "_not_method=PATCH", | ||||||
|  |       headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"} | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     context = create_request_and_return_io_and_context(Kemal::OverrideMethodHandler::INSTANCE, request)[1] | ||||||
|  | 
 | ||||||
|  |     context.request.method.should eq "POST" | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   it "overrides method with _method for POST requests" do | ||||||
|  |     request = HTTP::Request.new( | ||||||
|  |       "POST", | ||||||
|  |       "/", | ||||||
|  |       body: "_method=PATCH", | ||||||
|  |       headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"} | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     context = create_request_and_return_io_and_context(Kemal::OverrideMethodHandler::INSTANCE, request)[1] | ||||||
|  | 
 | ||||||
|  |     context.request.method.should eq "PATCH" | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										24
									
								
								src/kemal/override_method_handler.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/kemal/override_method_handler.cr
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | module Kemal | ||||||
|  |   class OverrideMethodHandler | ||||||
|  |     include HTTP::Handler | ||||||
|  |     INSTANCE = new | ||||||
|  | 
 | ||||||
|  |     ALLOWED_METHODS           = ["PUT", "PATCH", "DELETE"] | ||||||
|  |     OVERRIDE_METHOD           = "POST" | ||||||
|  |     OVERRIDE_METHOD_PARAM_KEY = "_method" | ||||||
|  | 
 | ||||||
|  |     def call(context) | ||||||
|  |       request = context.request | ||||||
|  |       if request.method == OVERRIDE_METHOD | ||||||
|  |         if context.params.body.has_key?(OVERRIDE_METHOD_PARAM_KEY) && override_method_valid?(context.params.body["_method"]) | ||||||
|  |           request.method = context.params.body["_method"].upcase | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       call_next(context) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def override_method_valid?(override_method : String) | ||||||
|  |       ALLOWED_METHODS.includes?(override_method.upcase) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue