diff --git a/lib/protocol/http1/connection.rb b/lib/protocol/http1/connection.rb index e5d84bc..c4846f7 100644 --- a/lib/protocol/http1/connection.rb +++ b/lib/protocol/http1/connection.rb @@ -8,8 +8,8 @@ # Copyright, 2024, by Anton Zhuravsky. require "protocol/http/headers" +require "protocol/http/status" -require_relative "reason" require_relative "error" require_relative "body" @@ -277,7 +277,7 @@ def write_request(authority, method, target, version, headers) # @parameter headers [Hash] the HTTP headers. # @parameter reason [String] the reason phrase, defaults to the standard reason phrase for the status code. def write_response(version, status, headers, reason = nil) - reason ||= Reason::DESCRIPTIONS[status] + reason ||= Protocol::HTTP::Status.description(status) unless @state == :open or @state == :half_closed_remote raise ProtocolError, "Cannot write response in state: #{@state}!" @@ -297,7 +297,7 @@ def write_response(version, status, headers, reason = nil) # @parameter reason [String] the reason phrase, defaults to the standard reason phrase for the status code. # @raises [ProtocolError] if the connection is not in the open or half-closed remote state. def write_interim_response(version, status, headers, reason = nil) - reason ||= Reason::DESCRIPTIONS[status] + reason ||= Protocol::HTTP::Status.description(status) unless @state == :open or @state == :half_closed_remote raise ProtocolError, "Cannot write interim response in state: #{@state}!" diff --git a/lib/protocol/http1/reason.rb b/lib/protocol/http1/reason.rb deleted file mode 100644 index cec198d..0000000 --- a/lib/protocol/http1/reason.rb +++ /dev/null @@ -1,84 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2019-2025, by Samuel Williams. - -require "protocol/http/error" - -module Protocol - module HTTP1 - # Reason phrases for HTTP status codes. - module Reason - # Get the reason phrase for the given status code. - DESCRIPTIONS = { - 100 => "Continue", - 101 => "Switching Protocols", - 102 => "Processing", - 103 => "Early Hints", - - 200 => "OK", - 201 => "Created", - 202 => "Accepted", - 203 => "Non-Authoritative Information", - 204 => "No Content", - 205 => "Reset Content", - 206 => "Partial Content", - 207 => "Multi-Status", - 208 => "Already Reported", - 226 => "IM Used", - - 300 => "Multiple Choices", - 301 => "Moved Permanently", - 302 => "Found", - 303 => "See Other", - 304 => "Not Modified", - 305 => "Use Proxy", - - # no longer used, but included for completeness - 306 => "Switch Proxy", - 307 => "Temporary Redirect", - 308 => "Permanent Redirect", - - 400 => "Bad Request", - 401 => "Unauthorized", - 402 => "Payment Required", - 403 => "Forbidden", - 404 => "Not Found", - 405 => "Method Not Allowed", - 406 => "Not Acceptable", - 407 => "Proxy Authentication Required", - 408 => "Request Timeout", - 409 => "Conflict", - 410 => "Gone", - 411 => "Length Required", - 412 => "Precondition Failed", - 413 => "Payload Too Large", - 414 => "URI Too Long", - 415 => "Unsupported Media Type", - 416 => "Range Not Satisfiable", - 417 => "Expectation Failed", - 421 => "Misdirected Request", - 422 => "Unprocessable Entity", - 423 => "Locked", - 424 => "Failed Dependency", - 426 => "Upgrade Required", - 428 => "Precondition Required", - 429 => "Too Many Requests", - 431 => "Request Header Fields Too Large", - 451 => "Unavailable for Legal Reasons", - - 500 => "Internal Server Error", - 501 => "Not Implemented", - 502 => "Bad Gateway", - 503 => "Service Unavailable", - 504 => "Gateway Timeout", - 505 => "HTTP Version Not Supported", - 506 => "Variant Also Negotiates", - 507 => "Insufficient Storage", - 508 => "Loop Detected", - 510 => "Not Extended", - 511 => "Network Authentication Required" - }.freeze - end - end -end diff --git a/protocol-http1.gemspec b/protocol-http1.gemspec index 8d044f6..7eb6e02 100644 --- a/protocol-http1.gemspec +++ b/protocol-http1.gemspec @@ -24,5 +24,5 @@ Gem::Specification.new do |spec| spec.required_ruby_version = ">= 3.3" - spec.add_dependency "protocol-http", "~> 0.62" + spec.add_dependency "protocol-http", "~> 0.68" end diff --git a/releases.md b/releases.md index c1e220b..73ef7bb 100644 --- a/releases.md +++ b/releases.md @@ -1,5 +1,9 @@ # Releases +## Unreleased + + - Use `Protocol::HTTP::Status` for standard HTTP status descriptions and remove the duplicate `Protocol::HTTP1::Reason` table. + ## v0.39.0 - Rename `RequestRefusedError` -\> `RefusedError`. diff --git a/test/protocol/http1/connection.rb b/test/protocol/http1/connection.rb index 78b2915..c440bdf 100644 --- a/test/protocol/http1/connection.rb +++ b/test/protocol/http1/connection.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # Released under the MIT License. -# Copyright, 2019-2025, by Samuel Williams. +# Copyright, 2019-2026, by Samuel Williams. # Copyright, 2019, by Brian Morearty. # Copyright, 2020, by Bruno Sutic. # Copyright, 2024, by Thomas Morgan. @@ -177,6 +177,14 @@ end with "#write_response" do + it "uses the standard status description" do + server.open! + server.write_response("HTTP/1.1", 418, {}) + server.close + + expect(client.stream.read).to be == "HTTP/1.1 418 I'm a Teapot\r\n" + end + it "fails to write a response with invalid header name" do server.open!