diff --git a/lib/utopia/request.rb b/lib/utopia/request.rb index 6685a0c6..f087cc37 100644 --- a/lib/utopia/request.rb +++ b/lib/utopia/request.rb @@ -117,28 +117,13 @@ def query_parameters @query_parameters ||= parse_query_parameters(self.url.query) end - private def parse_cookies(cookie_header) - cookies = {} - - return cookies unless cookie_header - - if cookie_header.respond_to?(:to_str) - cookie_header = cookie_header.to_str - else - cookie_header = cookie_header.to_s - end - - cookie_header.split(/;\s*/).each do |pair| - key, value = pair.split("=", 2) - cookies[key] = value || "" - end - - return cookies - end - # Decoded request cookies. def cookies - @cookies ||= parse_cookies(self.headers["cookie"]) + @cookies ||= if cookie_header = self.headers["cookie"] + cookie_header.to_h.transform_values(&:value) + else + {} + end end # The request user agent. diff --git a/test/utopia/application.rb b/test/utopia/application.rb index 906bf59d..902d8670 100644 --- a/test/utopia/application.rb +++ b/test/utopia/application.rb @@ -33,6 +33,17 @@ expect(response.headers["content-type"]).to be == "text/plain; charset=utf-8" end + it "yields the builder to blocks accepting arguments" do + application = subject.build do |builder| + builder.run Protocol::HTTP::Middleware.for{|request| Utopia::Response.text("Hello")} + end + + response = application.call(http_request) + + expect(response.status).to be == 200 + expect(response.read).to be == "Hello" + end + it "normalizes protocol response objects" do response_object = Object.new diff --git a/test/utopia/middleware.rb b/test/utopia/middleware.rb index a9692b22..52afbe92 100644 --- a/test/utopia/middleware.rb +++ b/test/utopia/middleware.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # Released under the MIT License. -# Copyright, 2015-2025, by Samuel Williams. +# Copyright, 2015-2026, by Samuel Williams. require "utopia/middleware" @@ -9,4 +9,10 @@ it "should give a default path relative to the cwd" do expect(File).to be(:exist?, Utopia.default_root(".content", __dir__)) end + + it "constructs the default application path" do + path = Utopia.default_path(".content", __dir__) + + expect(path).to be == Utopia::Path[Utopia.default_root(".content", __dir__)] + end end diff --git a/test/utopia/request.rb b/test/utopia/request.rb index 3e63ec3c..0e12629e 100644 --- a/test/utopia/request.rb +++ b/test/utopia/request.rb @@ -52,6 +52,14 @@ expect(request.post?).to be == false end + it "identifies QUERY requests" do + request.method = "QUERY" + expect(request).to be(:query?) + + request.method = "GET" + expect(request).not.to be(:query?) + end + it "provides decoded query arguments" do expect(request.query_parameters).to be == { "q" => "utopia", @@ -90,7 +98,8 @@ expect(request).not.to be(:respond_to?, :parsed_body) end - it "provides decoded cookies" do + it "provides cookie values" do + expect(request.headers["cookie"]).to be_a(Protocol::HTTP::Header::Cookie) expect(request.cookies).to be == {"a" => "1", "b" => "2"} end diff --git a/test/utopia/response.rb b/test/utopia/response.rb index d8f8094e..2e1fbe18 100644 --- a/test/utopia/response.rb +++ b/test/utopia/response.rb @@ -20,6 +20,14 @@ expect(response.headers["location"]).to be == "/target" end + it "builds HTML responses" do + response = subject.html("