Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 5 additions & 20 deletions lib/utopia/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
11 changes: 11 additions & 0 deletions test/utopia/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 7 additions & 1 deletion test/utopia/middleware.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2015-2025, by Samuel Williams.
# Copyright, 2015-2026, by Samuel Williams.

require "utopia/middleware"

describe Utopia do
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
11 changes: 10 additions & 1 deletion test/utopia/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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

Expand Down
8 changes: 8 additions & 0 deletions test/utopia/response.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@
expect(response.headers["location"]).to be == "/target"
end

it "builds HTML responses" do
response = subject.html("<h1>Hello</h1>", 201)

expect(response.status).to be == 201
expect(response.headers["content-type"]).to be == "text/html; charset=utf-8"
expect(response.read).to be == "<h1>Hello</h1>"
end

it "passes through protocol responses" do
response = Protocol::HTTP::Response[204]

Expand Down
2 changes: 1 addition & 1 deletion utopia.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
spec.add_dependency "msgpack"
spec.add_dependency "net-smtp"
spec.add_dependency "protocol-content", "~> 0.1"
spec.add_dependency "protocol-http", "~> 0.70"
spec.add_dependency "protocol-http", "~> 0.71"
spec.add_dependency "protocol-media", "~> 0.3"
spec.add_dependency "protocol-media-registry", "~> 0.1"
spec.add_dependency "protocol-url", "~> 0.18"
Expand Down
Loading