mirror of
				https://gitea.invidious.io/iv-org/shard-kemal.git
				synced 2024-08-15 00:53:36 +00:00 
			
		
		
		
	Add Kemal::Context.get? to safely access context storage. Fixes #428
This commit is contained in:
		
							parent
							
								
									17bd3dce37
								
							
						
					
					
						commit
						4034dab952
					
				
					 2 changed files with 98 additions and 58 deletions
				
			
		|  | @ -1,6 +1,7 @@ | |||
| require "./spec_helper" | ||||
| 
 | ||||
| describe "Context" do | ||||
|   context "headers" do | ||||
|     it "sets content type" do | ||||
|       get "/" do |env| | ||||
|         env.response.content_type = "application/json" | ||||
|  | @ -31,28 +32,21 @@ describe "Context" do | |||
|       client_response = call_request_on_app(request) | ||||
|       client_response.headers["Accept-Language"].should eq "tr" | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   it "can store variables" do | ||||
|   context "storage" do | ||||
|     it "can store primitive types" do | ||||
|       before_get "/" do |env| | ||||
|       t = TestContextStorageType.new | ||||
|       t.id = 32 | ||||
|       a = AnotherContextStorageType.new | ||||
|       env.set "key", "value" | ||||
|         env.set "before_get", "Kemal" | ||||
|         env.set "before_get_int", 123 | ||||
|       env.set "before_get_context_test", t | ||||
|       env.set "another_context_test", a | ||||
|         env.set "before_get_float", 3.5 | ||||
|       end | ||||
| 
 | ||||
|       get "/" do |env| | ||||
|       env.set "key", "value" | ||||
|         { | ||||
|         key:                     env.get("key"), | ||||
|           before_get:              env.get("before_get"), | ||||
|           before_get_int:          env.get("before_get_int"), | ||||
|         before_get_float:        env.get("before_get_float"), | ||||
|         before_get_context_test: env.get("before_get_context_test"), | ||||
|           before_get_float:        env.get("before_get_float") | ||||
|         } | ||||
|       end | ||||
| 
 | ||||
|  | @ -62,10 +56,52 @@ describe "Context" do | |||
|       context = HTTP::Server::Context.new(request, response) | ||||
|       Kemal::FilterHandler::INSTANCE.call(context) | ||||
|       Kemal::RouteHandler::INSTANCE.call(context) | ||||
|     context.store["key"].should eq "value" | ||||
|     context.store["before_get"].should eq "Kemal" | ||||
|     context.store["before_get_int"].should eq 123 | ||||
|     context.store["before_get_float"].should eq 3.5 | ||||
|     context.store["before_get_context_test"].as(TestContextStorageType).id.should eq 32 | ||||
| 
 | ||||
|       context.get("before_get").should eq "Kemal" | ||||
|       context.get("before_get_int").should eq 123 | ||||
|       context.get("before_get_float").should eq 3.5 | ||||
|     end | ||||
| 
 | ||||
|     it "can store custom types" do | ||||
|       before_get "/" do |env| | ||||
|         t = TestContextStorageType.new | ||||
|         t.id = 32 | ||||
|         a = AnotherContextStorageType.new | ||||
| 
 | ||||
|         env.set "before_get_context_test", t | ||||
|         env.set "another_context_test", a | ||||
|       end | ||||
| 
 | ||||
|       get "/" do |env| | ||||
|         { | ||||
|           before_get_context_test: env.get("before_get_context_test"), | ||||
|           another_context_test: env.get("another_context_test"), | ||||
|         } | ||||
|       end | ||||
| 
 | ||||
|       request = HTTP::Request.new("GET", "/") | ||||
|       io = IO::Memory.new | ||||
|       response = HTTP::Server::Response.new(io) | ||||
|       context = HTTP::Server::Context.new(request, response) | ||||
|       Kemal::FilterHandler::INSTANCE.call(context) | ||||
|       Kemal::RouteHandler::INSTANCE.call(context) | ||||
| 
 | ||||
|       context.get("before_get_context_test").as(TestContextStorageType).id.should eq 32 | ||||
|       context.get("another_context_test").as(AnotherContextStorageType).name.should eq "kemal-context" | ||||
|     end | ||||
| 
 | ||||
|     it "fetches non-existent keys from store with get?" do | ||||
|       get "/" {} | ||||
| 
 | ||||
|       request = HTTP::Request.new("GET", "/") | ||||
|       io = IO::Memory.new | ||||
|       response = HTTP::Server::Response.new(io) | ||||
|       context = HTTP::Server::Context.new(request, response) | ||||
|       Kemal::FilterHandler::INSTANCE.call(context) | ||||
|       Kemal::RouteHandler::INSTANCE.call(context) | ||||
| 
 | ||||
|       context.get?("non_existent_key").should eq nil | ||||
|       context.get?("another_non_existent_key").should eq nil | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ class HTTP::Server | |||
| 
 | ||||
|     macro finished | ||||
|       alias StoreTypes = Union({{ *STORE_MAPPINGS }}) | ||||
|       getter store = {} of String => StoreTypes | ||||
|       @store = {} of String => StoreTypes | ||||
|     end | ||||
| 
 | ||||
|     def params | ||||
|  | @ -58,5 +58,9 @@ class HTTP::Server | |||
|     def set(name : String, value : StoreTypes) | ||||
|       @store[name] = value | ||||
|     end | ||||
| 
 | ||||
|     def get?(name : String) | ||||
|       @store[name]? | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue