Skip to content
Open
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
4 changes: 3 additions & 1 deletion lib/protocol/http/header/accept.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ class Accept < Split
(?=,|\z) # Match until a comma or end of string
/x

ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

MEDIA_RANGE = /\A(?<type>#{TOKEN})\/(?<subtype>#{TOKEN})(?<parameters>.*)\z/

Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/accept_charset.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ module HTTP
module Header
# The `accept-charset` header represents a list of character sets that the client can accept.
class AcceptCharset < Split
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

# https://tools.ietf.org/html/rfc7231#section-5.3.3
CHARSET = /\A(?<name>#{TOKEN})(;q=(?<q>#{QVALUE}))?\z/
Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/accept_encoding.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ module HTTP
module Header
# The `accept-encoding` header represents a list of encodings that the client can accept.
class AcceptEncoding < Split
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

# https://tools.ietf.org/html/rfc7231#section-5.3.1
QVALUE = /0(\.[0-9]{0,3})?|1(\.[0]{0,3})?/
Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/accept_language.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ module HTTP
module Header
# The `accept-language` header represents a list of languages that the client can accept.
class AcceptLanguage < Split
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

# https://tools.ietf.org/html/rfc3066#section-2.1
NAME = /\*|[A-Z]{1,8}(-[A-Z0-9]{1,8})*/i
Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/digest.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ module Header
# # => "sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=, md5=9bb58f26192e4ba00f01e2e7b136bbd8"
# ```
class Digest < Split
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

# https://tools.ietf.org/html/rfc3230#section-4.3.2
ENTRY = /\A(?<algorithm>[a-zA-Z0-9][a-zA-Z0-9\-]*)\s*=\s*(?<value>.*)\z/
Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/range.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ module HTTP
module Header
# Represents a `range` request header.
class Range
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

TOKEN = /[!#$%&'*+\-.0-9A-Z^_`a-z|~]+/
HEADER = /\A(?<unit>#{TOKEN})=(?<ranges>.*)\z/
Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/server_timing.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ module Header
# # => "db;dur=53.2, cache;dur=12.1;desc=\"Redis lookup\""
# ```
class ServerTiming < Split
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

# https://www.w3.org/TR/server-timing/
METRIC = /\A(?<name>[a-zA-Z0-9][a-zA-Z0-9_\-]*)(;(?<parameters>.*))?\z/
Expand Down
4 changes: 3 additions & 1 deletion lib/protocol/http/header/te.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ module Header
#
# The `te` header allows a client to indicate which transfer encodings it can handle, and in what order of preference using quality factors.
class TE < Split
ParseError = Class.new(Error)
ParseError = Class.new(Error) do
include BadRequest
end

# Transfer encoding token pattern
TOKEN = /[!#$%&'*+\-.0-9A-Z^_`a-z|~]+/
Expand Down
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ Please see the [project releases](https://socketry.github.io/protocol-http/relea
### v0.67.0

- Parse and resolve HTTP `Range` header values according to the default headers policy.
- Classify malformed header values as bad requests.

### v0.66.0

Expand Down
1 change: 1 addition & 0 deletions releases.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## v0.67.0

- Parse and resolve HTTP `Range` header values according to the default headers policy.
- Classify malformed header values as bad requests.

## v0.66.0

Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/accept.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
end

describe Protocol::HTTP::Header::Accept do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}
let(:media_ranges) {header.media_ranges.sort}

Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/accept_charset.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
end

describe Protocol::HTTP::Header::AcceptCharset do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}
let(:charsets) {header.charsets.sort}

Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/accept_encoding.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
end

describe Protocol::HTTP::Header::AcceptEncoding do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}
let(:encodings) {header.encodings.sort}

Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/accept_language.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
end

describe Protocol::HTTP::Header::AcceptLanguage do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}
let(:languages) {header.languages.sort}

Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/digest.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
require "sus"

describe Protocol::HTTP::Header::Digest do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}

with "empty header" do
Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/range.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
require "protocol/http/header/range"

describe Protocol::HTTP::Header::Range do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

with ".parse" do
it "parses byte ranges" do
header = subject.parse("bytes=0-4, 10-, -5")
Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/server_timing.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
require "sus"

describe Protocol::HTTP::Header::ServerTiming do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}

with "empty header" do
Expand Down
4 changes: 4 additions & 0 deletions test/protocol/http/header/te.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
require "protocol/http/header/te"

describe Protocol::HTTP::Header::TE do
it "classifies parse errors as bad requests" do
expect(subject::ParseError.new).to be_a(Protocol::HTTP::BadRequest)
end

let(:header) {subject.parse(description)}

with "chunked" do
Expand Down
Loading