mirror of
				https://gitea.invidious.io/iv-org/shard-kemal.git
				synced 2024-08-15 00:53:36 +00:00 
			
		
		
		
	Receive Frank::Context and allow setting content-type
This commit is contained in:
		
							parent
							
								
									fc4f648c1a
								
							
						
					
					
						commit
						889debfd59
					
				
					 6 changed files with 41 additions and 14 deletions
				
			
		|  | @ -10,4 +10,14 @@ describe "Frank::Handler" do | ||||||
|     response = frank.call(request) |     response = frank.call(request) | ||||||
|     response.body.should eq("hello") |     response.body.should eq("hello") | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   it "sets content type" do | ||||||
|  |     frank = Frank::Handler.new | ||||||
|  |     frank.add_route "GET", "/" do |env| | ||||||
|  |       env.response.content_type = "application/json" | ||||||
|  |     end | ||||||
|  |     request = HTTP::Request.new("GET", "/") | ||||||
|  |     response = frank.call(request) | ||||||
|  |     response.headers["Content-Type"].should eq("application/json") | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								src/frank/context.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/frank/context.cr
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | class Frank::Context | ||||||
|  |   getter request | ||||||
|  | 
 | ||||||
|  |   def initialize(@request) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def response | ||||||
|  |     @response ||= Response.new | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def response? | ||||||
|  |     @response | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| def get(path, &block : Frank::Request -> String) | def get(path, &block : Frank::Context -> _) | ||||||
|   Frank::Handler::INSTANCE.add_route("GET", path, &block) |   Frank::Handler::INSTANCE.add_route("GET", path, &block) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| def post(path, &block : Frank::Request -> String) | def post(path, &block : Frank::Context -> _) | ||||||
|   Frank::Handler::INSTANCE.add_route("POST", path, &block) |   Frank::Handler::INSTANCE.add_route("POST", path, &block) | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -8,18 +8,11 @@ class Frank::Handler < HTTP::Handler | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def call(request) |   def call(request) | ||||||
|     if body = exec_request(request) |     response = exec_request(request) | ||||||
|       begin |     response || call_next(request) | ||||||
|         HTTP::Response.new("HTTP/1.1", 200, "OK", {"Content-Type" => "text/plain"}, body) |  | ||||||
|       rescue ex |  | ||||||
|         HTTP::Response.new("HTTP/1.1", 500, "Internal Server Error", {"Content-Type" => "text/plain"}, ex.to_s) |  | ||||||
|       end |  | ||||||
|     else |  | ||||||
|       call_next(request) |  | ||||||
|     end |  | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def add_route(method, path, &handler : Frank::Request -> String) |   def add_route(method, path, &handler : Frank::Context -> _) | ||||||
|     @routes << Route.new(method, path, &handler) |     @routes << Route.new(method, path, &handler) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  | @ -29,7 +22,14 @@ class Frank::Handler < HTTP::Handler | ||||||
|       params = route.match(request.method, components) |       params = route.match(request.method, components) | ||||||
|       if params |       if params | ||||||
|         frank_request = Request.new(params) |         frank_request = Request.new(params) | ||||||
|         return route.handler.call(frank_request) |         context = Context.new(frank_request) | ||||||
|  |         begin | ||||||
|  |           body = route.handler.call(context).to_s | ||||||
|  |           content_type = context.response?.try(&.content_type) || "text/plain" | ||||||
|  |           return HTTP::Response.new("HTTP/1.1", 200, "OK", {"Content-Type" => content_type}, body) | ||||||
|  |         rescue ex | ||||||
|  |           return HTTP::Response.new("HTTP/1.1", 500, "Internal Server Error", {"Content-Type" => "text/plain"}, ex.to_s) | ||||||
|  |         end | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|     nil |     nil | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								src/frank/response.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/frank/response.cr
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | class Frank::Response | ||||||
|  |   property content_type | ||||||
|  | end | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| class Frank::Route | class Frank::Route | ||||||
|   getter handler |   getter handler | ||||||
| 
 | 
 | ||||||
|   def initialize(@method, path, &@handler : Frank::Request -> String) |   def initialize(@method, path, &@handler : Frank::Context -> _) | ||||||
|     @components = path.split "/" |     @components = path.split "/" | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue