diff --git a/spec/frank_handler_spec.cr b/spec/frank_handler_spec.cr index de87e7e..e9ef151 100644 --- a/spec/frank_handler_spec.cr +++ b/spec/frank_handler_spec.cr @@ -10,4 +10,14 @@ describe "Frank::Handler" do response = frank.call(request) response.body.should eq("hello") 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 diff --git a/src/frank/context.cr b/src/frank/context.cr new file mode 100644 index 0000000..be38087 --- /dev/null +++ b/src/frank/context.cr @@ -0,0 +1,14 @@ +class Frank::Context + getter request + + def initialize(@request) + end + + def response + @response ||= Response.new + end + + def response? + @response + end +end diff --git a/src/frank/dsl.cr b/src/frank/dsl.cr index 8241982..2165f7d 100644 --- a/src/frank/dsl.cr +++ b/src/frank/dsl.cr @@ -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) end -def post(path, &block : Frank::Request -> String) +def post(path, &block : Frank::Context -> _) Frank::Handler::INSTANCE.add_route("POST", path, &block) end diff --git a/src/frank/handler.cr b/src/frank/handler.cr index e28f432..efe51bf 100644 --- a/src/frank/handler.cr +++ b/src/frank/handler.cr @@ -8,18 +8,11 @@ class Frank::Handler < HTTP::Handler end def call(request) - if body = exec_request(request) - begin - 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 + response = exec_request(request) + response || call_next(request) end - def add_route(method, path, &handler : Frank::Request -> String) + def add_route(method, path, &handler : Frank::Context -> _) @routes << Route.new(method, path, &handler) end @@ -29,7 +22,14 @@ class Frank::Handler < HTTP::Handler params = route.match(request.method, components) if 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 nil diff --git a/src/frank/response.cr b/src/frank/response.cr new file mode 100644 index 0000000..b2cb1a1 --- /dev/null +++ b/src/frank/response.cr @@ -0,0 +1,3 @@ +class Frank::Response + property content_type +end diff --git a/src/frank/route.cr b/src/frank/route.cr index fce5dae..0c29664 100644 --- a/src/frank/route.cr +++ b/src/frank/route.cr @@ -1,7 +1,7 @@ class Frank::Route getter handler - def initialize(@method, path, &@handler : Frank::Request -> String) + def initialize(@method, path, &@handler : Frank::Context -> _) @components = path.split "/" end