protocol-http 0.45.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/protocol/http/accept_encoding.rb +15 -3
  4. data/lib/protocol/http/body/buffered.rb +29 -2
  5. data/lib/protocol/http/body/completable.rb +13 -0
  6. data/lib/protocol/http/body/deflate.rb +33 -0
  7. data/lib/protocol/http/body/digestable.rb +19 -4
  8. data/lib/protocol/http/body/file.rb +37 -1
  9. data/lib/protocol/http/body/head.rb +8 -0
  10. data/lib/protocol/http/body/inflate.rb +10 -2
  11. data/lib/protocol/http/body/readable.rb +32 -11
  12. data/lib/protocol/http/body/reader.rb +17 -0
  13. data/lib/protocol/http/body/rewindable.rb +19 -1
  14. data/lib/protocol/http/body/stream.rb +34 -6
  15. data/lib/protocol/http/body/streamable.rb +46 -5
  16. data/lib/protocol/http/body/wrapper.rb +25 -3
  17. data/lib/protocol/http/body/writable.rb +48 -7
  18. data/lib/protocol/http/body.rb +16 -0
  19. data/lib/protocol/http/content_encoding.rb +13 -3
  20. data/lib/protocol/http/cookie.rb +23 -0
  21. data/lib/protocol/http/header/authorization.rb +10 -2
  22. data/lib/protocol/http/header/cache_control.rb +42 -10
  23. data/lib/protocol/http/header/connection.rb +18 -1
  24. data/lib/protocol/http/header/cookie.rb +10 -3
  25. data/lib/protocol/http/header/date.rb +9 -0
  26. data/lib/protocol/http/header/etag.rb +11 -0
  27. data/lib/protocol/http/header/etags.rb +35 -4
  28. data/lib/protocol/http/header/multiple.rb +9 -1
  29. data/lib/protocol/http/header/priority.rb +55 -0
  30. data/lib/protocol/http/header/split.rb +17 -3
  31. data/lib/protocol/http/header/vary.rb +10 -1
  32. data/lib/protocol/http/headers.rb +82 -19
  33. data/lib/protocol/http/methods.rb +5 -0
  34. data/lib/protocol/http/middleware/builder.rb +17 -0
  35. data/lib/protocol/http/middleware.rb +28 -0
  36. data/lib/protocol/http/peer.rb +9 -0
  37. data/lib/protocol/http/reference.rb +33 -6
  38. data/lib/protocol/http/request.rb +25 -0
  39. data/lib/protocol/http/response.rb +12 -0
  40. data/lib/protocol/http/url.rb +34 -8
  41. data/lib/protocol/http/version.rb +1 -1
  42. data/readme.md +4 -0
  43. data/releases.md +4 -0
  44. data.tar.gz.sig +0 -0
  45. metadata +4 -2
  46. metadata.gz.sig +0 -0
@@ -6,33 +6,46 @@
6
6
 
7
7
  module Protocol
8
8
  module HTTP
9
+ # Helpers for working with URLs.
9
10
  module URL
10
- # Escapes a string using percent encoding.
11
+ # Escapes a string using percent encoding, e.g. `a b` -> `a%20b`.
12
+ #
13
+ # @parameter string [String] The string to escape.
14
+ # @returns [String] The escaped string.
11
15
  def self.escape(string, encoding = string.encoding)
12
16
  string.b.gsub(/([^a-zA-Z0-9_.\-]+)/) do |m|
13
17
  "%" + m.unpack("H2" * m.bytesize).join("%").upcase
14
18
  end.force_encoding(encoding)
15
19
  end
16
20
 
17
- # Unescapes a percent encoded string.
21
+ # Unescapes a percent encoded string, e.g. `a%20b` -> `a b`.
22
+ #
23
+ # @parameter string [String] The string to unescape.
24
+ # @returns [String] The unescaped string.
18
25
  def self.unescape(string, encoding = string.encoding)
19
26
  string.b.gsub(/%(\h\h)/) do |hex|
20
27
  Integer($1, 16).chr
21
28
  end.force_encoding(encoding)
22
29
  end
23
30
 
24
- # According to https://tools.ietf.org/html/rfc3986#section-3.3, we escape non-pchar.
25
- NON_PCHAR = /([^a-zA-Z0-9_\-\.~!$&'()*+,;=:@\/]+)/.freeze
31
+ # Matches characters that are not allowed in a URI path segment. According to RFC 3986 Section 3.3 (https://tools.ietf.org/html/rfc3986#section-3.3), a valid path segment consists of "pchar" characters. This pattern identifies characters that must be percent-encoded when included in a URI path segment.
32
+ NON_PATH_CHARACTER_PATTERN = /([^a-zA-Z0-9_\-\.~!$&'()*+,;=:@\/]+)/.freeze
26
33
 
27
- # Escapes non-path characters using percent encoding.
34
+ # Escapes non-path characters using percent encoding. In other words, this method escapes characters that are not allowed in a URI path segment. According to RFC 3986 Section 3.3 (https://tools.ietf.org/html/rfc3986#section-3.3), a valid path segment consists of "pchar" characters. This method percent-encodes characters that are not "pchar" characters.
35
+ #
36
+ # @parameter path [String] The path to escape.
37
+ # @returns [String] The escaped path.
28
38
  def self.escape_path(path)
29
39
  encoding = path.encoding
30
- path.b.gsub(NON_PCHAR) do |m|
40
+ path.b.gsub(NON_PATH_CHARACTER_PATTERN) do |m|
31
41
  "%" + m.unpack("H2" * m.bytesize).join("%").upcase
32
42
  end.force_encoding(encoding)
33
43
  end
34
44
 
35
- # Encodes a hash or array into a query string.
45
+ # Encodes a hash or array into a query string. This method is used to encode query parameters in a URL. For example, `{"a" => 1, "b" => 2}` is encoded as `a=1&b=2`.
46
+ #
47
+ # @parameter value [Hash | Array | Nil] The value to encode.
48
+ # @parameter prefix [String] The prefix to use for keys.
36
49
  def self.encode(value, prefix = nil)
37
50
  case value
38
51
  when Array
@@ -66,6 +79,10 @@ module Protocol
66
79
  end
67
80
  end
68
81
 
82
+ # Split a key into parts, e.g. `a[b][c]` -> `["a", "b", "c"]`.
83
+ #
84
+ # @parameter name [String] The key to split.
85
+ # @returns [Array(String)] The parts of the key.
69
86
  def self.split(name)
70
87
  name.scan(/([^\[]+)|(?:\[(.*?)\])/)&.tap do |parts|
71
88
  parts.flatten!
@@ -74,6 +91,10 @@ module Protocol
74
91
  end
75
92
 
76
93
  # Assign a value to a nested hash.
94
+ #
95
+ # @parameter keys [Array(String)] The parts of the key.
96
+ # @parameter value [Object] The value to assign.
97
+ # @parameter parent [Hash] The parent hash.
77
98
  def self.assign(keys, value, parent)
78
99
  top, *middle = keys
79
100
 
@@ -94,7 +115,12 @@ module Protocol
94
115
  parent[top] = value
95
116
  end
96
117
 
97
- # TODO use native C extension from `Trenni::Reference`.
118
+ # Decode a URL-encoded query string into a hash.
119
+ #
120
+ # @parameter string [String] The query string to decode.
121
+ # @parameter maximum [Integer] The maximum number of keys in a path.
122
+ # @parameter symbolize_keys [Boolean] Whether to symbolize keys.
123
+ # @returns [Hash] The decoded query string.
98
124
  def self.decode(string, maximum = 8, symbolize_keys: false)
99
125
  parameters = {}
100
126
 
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Protocol
7
7
  module HTTP
8
- VERSION = "0.45.0"
8
+ VERSION = "0.47.0"
9
9
  end
10
10
  end
data/readme.md CHANGED
@@ -24,6 +24,10 @@ Please see the [project documentation](https://socketry.github.io/protocol-http/
24
24
 
25
25
  Please see the [project releases](https://socketry.github.io/protocol-http/releases/index) for all releases.
26
26
 
27
+ ### v0.46.0
28
+
29
+ - Add support for `priority:` header.
30
+
27
31
  ### v0.33.0
28
32
 
29
33
  - Clarify behaviour of streaming bodies and copy `Protocol::Rack::Body::Streaming` to `Protocol::HTTP::Body::Streamable`.
data/releases.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Releases
2
2
 
3
+ ## v0.46.0
4
+
5
+ - Add support for `priority:` header.
6
+
3
7
  ## v0.33.0
4
8
 
5
9
  - Clarify behaviour of streaming bodies and copy `Protocol::Rack::Body::Streaming` to `Protocol::HTTP::Body::Streamable`.
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.45.0
4
+ version: 0.47.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -47,7 +47,7 @@ cert_chain:
47
47
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
48
48
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
49
49
  -----END CERTIFICATE-----
50
- date: 2024-11-26 00:00:00.000000000 Z
50
+ date: 2024-11-28 00:00:00.000000000 Z
51
51
  dependencies: []
52
52
  description:
53
53
  email:
@@ -57,6 +57,7 @@ extra_rdoc_files: []
57
57
  files:
58
58
  - lib/protocol/http.rb
59
59
  - lib/protocol/http/accept_encoding.rb
60
+ - lib/protocol/http/body.rb
60
61
  - lib/protocol/http/body/buffered.rb
61
62
  - lib/protocol/http/body/completable.rb
62
63
  - lib/protocol/http/body/deflate.rb
@@ -82,6 +83,7 @@ files:
82
83
  - lib/protocol/http/header/etag.rb
83
84
  - lib/protocol/http/header/etags.rb
84
85
  - lib/protocol/http/header/multiple.rb
86
+ - lib/protocol/http/header/priority.rb
85
87
  - lib/protocol/http/header/split.rb
86
88
  - lib/protocol/http/header/vary.rb
87
89
  - lib/protocol/http/headers.rb
metadata.gz.sig CHANGED
Binary file