protocol-http 0.71.0 → 0.72.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e4555d4a7ae53c17ce8bd6ccf545bd01d6eeafdf4ee288ddfb3f2aae76a3327
4
- data.tar.gz: 7808028142ff2afc20f5fd7a5a1476e74c17fa7a847effaf924253d77858f1d3
3
+ metadata.gz: ac1df67c5b3f24bbe730e10a050a9c77f0f1098ef056632c8d67f3f25049e745
4
+ data.tar.gz: 662cca1dbeaeed071a5fb4302580ce36a6715a7b03c6dd6710a874c3954d045a
5
5
  SHA512:
6
- metadata.gz: c724bfa82172160c4982791c20c707e6b75fdef0bef4155da339ec092e2b86c16d92da18e540ee8254844766750fe7c2b7896a2cae4fb2da155385102ff8d9b7
7
- data.tar.gz: 7b965c45ef273d6dac8df08ead9282bc9f35a70d0dc3100739b2bc331ef690d5b532f7c1a8c74d547ba628e89a9291e945f3fd8a2a6ce42aab81e94454f8fff7
6
+ metadata.gz: 98d42577b95b47320a9fdcfdfbe99ef73503e37f2c12f3f949ae3eaad6a310f8fa9c5bafd9bcb242069c8d9b15a881c41303fb895a7e5e8519ef93b24a59279a
7
+ data.tar.gz: 89babae9b6c27863308729c7a0414482926db4e0044ecff1e8c1d32cbcb02ab5b776bf8d312e0c1219e758c091f0085684a2be0cd4620c97218e9b349f830c2d
data/context/index.yaml CHANGED
@@ -3,6 +3,8 @@
3
3
  ---
4
4
  description: Provides abstractions to handle HTTP protocols.
5
5
  metadata:
6
+ bug_tracker_uri: https://github.com/socketry/protocol-http/issues
7
+ changelog_uri: https://github.com/socketry/protocol-http/blob/main/releases.md
6
8
  documentation_uri: https://socketry.github.io/protocol-http/
7
9
  source_code_uri: https://github.com/socketry/protocol-http.git
8
10
  files:
@@ -259,6 +259,23 @@ content = uppercase.join # => "HELLO WORLD"
259
259
 
260
260
  ## Life-cycle
261
261
 
262
+ Bodies model application-facing streams. Their close operations describe what the application will do next; protocol implementations are responsible for mapping those operations to the wire protocol safely.
263
+
264
+ ### Directional Closure
265
+
266
+ Request and response bodies are independent, so a bidirectional {ruby Protocol::HTTP::Body::Stream} can close either direction without implicitly closing the other:
267
+
268
+ | Operation | Application-level meaning | Typical protocol consequence |
269
+ | --- | --- | --- |
270
+ | `read` returns `nil` | The peer or producer completed the input normally. | The inbound body has reached end-of-stream. |
271
+ | `close_read` before end-of-stream | The application will not consume the remaining input, but may continue writing. | Discard unread data, terminate the exchange, or make the connection non-reusable. |
272
+ | `close_write` without an error | The application has finished producing output, but may continue reading. | Preserve previously written data and send a normal end-of-stream. |
273
+ | `close` without an error | The application has finished with both directions. | Complete or terminate the exchange without reporting an application error. |
274
+ | `close` with an error | The application cannot continue the exchange successfully. | Propagate the error or terminate the exchange using an appropriate protocol error. |
275
+ | `discard` | Consume input without processing it. | Prefer preserving the exchange or connection for reuse. |
276
+
277
+ These operations update local application-facing state. Returning from a close operation does not guarantee that the peer has observed it or that the underlying transport has been closed synchronously. Those details depend on the protocol and may be completed later.
278
+
262
279
  ### Initialization
263
280
 
264
281
  Bodies are typically initialized with the data they need to process. For example:
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2024, by Samuel Williams.
4
+ # Copyright, 2019-2026, by Samuel Williams.
5
5
  # Copyright, 2023, by Bruno Sutic.
6
6
 
7
7
  require_relative "stream"
@@ -22,7 +22,11 @@ module Protocol
22
22
  class Readable
23
23
  # Close the stream immediately. After invoking this method, the stream should be considered closed, and all internal resources should be released.
24
24
  #
25
- # If an error occured while handling the output, it can be passed as an argument. This may be propagated to the client, for example the client may be informed that the stream was not fully read correctly.
25
+ # Closing the stream before it reaches end-of-file abandons any remaining input. The protocol implementation must account for that unread data before the associated exchange or connection can be reused. Depending on the protocol, it may discard the remaining data, terminate the exchange, or make the connection non-reusable. Use {discard} when preserving the exchange or connection is preferred.
26
+ #
27
+ # When closing before end-of-file, omitting the error represents deliberate application-level abandonment, not a protocol failure.
28
+ #
29
+ # If an error occurred while handling the output, it can be passed as an argument. This may be propagated to the client, for example the client may be informed that the stream was not fully read correctly.
26
30
  #
27
31
  # Invoking {read} after {close} will return `nil`.
28
32
  #
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2025, by Samuel Williams.
4
+ # Copyright, 2019-2026, by Samuel Williams.
5
5
  # Copyright, 2023, by Genki Takiuchi.
6
6
  # Copyright, 2025, by William T. Nelson.
7
7
 
@@ -347,7 +347,13 @@ module Protocol
347
347
  def flush
348
348
  end
349
349
 
350
- # Close the input body.
350
+ # Close the application-facing input body. This does not close the output body, which may continue to be written independently.
351
+ #
352
+ # If the input has not reached end-of-file, any remaining data is abandoned. The protocol implementation must ensure that unread data cannot interfere with subsequent exchanges. Depending on the protocol, it may discard the remaining data, terminate the current exchange, or make the connection non-reusable.
353
+ #
354
+ # Closing without an error represents orderly application-level abandonment, not a protocol failure.
355
+ #
356
+ # This method is idempotent. After the first call, subsequent calls have no effect.
351
357
  #
352
358
  # If, while processing the data that was read from this stream, an error is encountered, it should be passed to this method.
353
359
  #
@@ -362,7 +368,11 @@ module Protocol
362
368
  end
363
369
  end
364
370
 
365
- # Close the output body.
371
+ # Close the application-facing output body. This does not close the input body, which may continue to be read independently.
372
+ #
373
+ # Closing without an error indicates that no more output will be produced. Previously written data remains part of the output and should be followed by a normal end-of-stream from the protocol implementation. If an error is provided, the protocol implementation may terminate the exchange instead.
374
+ #
375
+ # This method is idempotent. After the first call, subsequent calls have no effect.
366
376
  #
367
377
  # If, while generating the data that is written to this stream, an error is encountered, it should be passed to this method.
368
378
  #
@@ -377,6 +387,10 @@ module Protocol
377
387
 
378
388
  # Close the input and output bodies.
379
389
  #
390
+ # Closing without an error represents orderly completion or abandonment of both application-facing directions, not cancellation. If the peer has not completed the exchange, the protocol implementation may need to terminate it without reporting an application error.
391
+ #
392
+ # Repeated calls are safe; each underlying direction will be closed at most once.
393
+ #
380
394
  # @parameter error [Exception | Nil] The error that caused this stream to be closed, if any.
381
395
  def close(error = nil)
382
396
  self.close_read(error)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2025, by Samuel Williams.
4
+ # Copyright, 2019-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "readable"
7
7
  require_relative "writable"
@@ -15,7 +15,7 @@ module Protocol
15
15
  #
16
16
  # In some cases, it's advantageous to directly read and write to the underlying stream if possible. For example, HTTP/1 upgrade requests, WebSockets, and similar. To handle that case, response bodies can implement {stream?} and return `true`. When {stream?} returns true, the body **should** be consumed by calling `call(stream)`. Server implementations may choose to always invoke `call(stream)` if it's efficient to do so. Bodies that don't support it will fall back to using {each}.
17
17
  #
18
- # When invoking `call(stream)`, the stream can be read from and written to, and closed. However, the stream is only guaranteed to be open for the duration of the `call(stream)` call. Once the method returns, the stream **should** be closed by the server.
18
+ # Invoking `call(stream)` transfers ownership of the stream to the called body. The body may read from and write to the stream, and **must** close it before returning. The caller must consider the stream closed and unusable after `call(stream)` returns.
19
19
  module Streamable
20
20
  # Generate a new streaming request body using the given block to generate the body.
21
21
  #
@@ -113,7 +113,7 @@ module Protocol
113
113
  @output.read
114
114
  end
115
115
 
116
- # Invoke the block with the given stream. The block can read and write to the stream, and must close the stream when finishing.
116
+ # Invoke the block with the given stream. The block owns the stream for the duration of the call and must close it before returning.
117
117
  #
118
118
  # @parameter stream [Stream] The stream to read and write to.
119
119
  def call(stream)
@@ -22,15 +22,17 @@ module Protocol
22
22
  # @deprecated Use {RefusedError} instead.
23
23
  RequestRefusedError = RefusedError
24
24
 
25
- # Represents a bad request error (as opposed to a server error).
26
- # This is used to indicate that the request was malformed or invalid.
25
+ # Marks errors which may indicate a malformed or invalid request when raised while processing an incoming request.
27
26
  module BadRequest
28
27
  end
29
28
 
30
- # Raised when a singleton (e.g. `content-length`) header is duplicated in a request or response.
31
- class DuplicateHeaderError < Error
29
+ # Raised when an HTTP header is malformed or invalid. When raised while processing an incoming request, it may be treated as a bad request.
30
+ class InvalidHeaderError < Error
32
31
  include BadRequest
33
-
32
+ end
33
+
34
+ # Raised when a singleton (e.g. `content-length`) header is duplicated in a request or response.
35
+ class DuplicateHeaderError < InvalidHeaderError
34
36
  # @parameter key [String] The header key that was duplicated.
35
37
  def initialize(key, existing_value, new_value)
36
38
  super("Duplicate singleton header key: #{key.inspect}")
@@ -62,9 +64,7 @@ module Protocol
62
64
  end
63
65
 
64
66
  # Raised when an invalid trailer header is encountered in headers.
65
- class InvalidTrailerError < Error
66
- include BadRequest
67
-
67
+ class InvalidTrailerError < InvalidHeaderError
68
68
  # @parameter key [String] The trailer key that is invalid.
69
69
  def initialize(key)
70
70
  super("Invalid trailer key: #{key.inspect}")
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
  # Copyright, 2025, by William T. Nelson.
6
6
 
7
7
  require_relative "split"
@@ -23,7 +23,7 @@ module Protocol
23
23
  (?=,|\z) # Match until a comma or end of string
24
24
  /x
25
25
 
26
- ParseError = Class.new(Error)
26
+ ParseError = Class.new(InvalidHeaderError)
27
27
 
28
28
  MEDIA_RANGE = /\A(?<type>#{TOKEN})\/(?<subtype>#{TOKEN})(?<parameters>.*)\z/
29
29
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "split"
7
7
  require_relative "../quoted_string"
@@ -12,7 +12,7 @@ module Protocol
12
12
  module Header
13
13
  # The `accept-charset` header represents a list of character sets that the client can accept.
14
14
  class AcceptCharset < Split
15
- ParseError = Class.new(Error)
15
+ ParseError = Class.new(InvalidHeaderError)
16
16
 
17
17
  # https://tools.ietf.org/html/rfc7231#section-5.3.3
18
18
  CHARSET = /\A(?<name>#{TOKEN})(;q=(?<q>#{QVALUE}))?\z/
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "split"
7
7
  require_relative "../quoted_string"
@@ -12,7 +12,7 @@ module Protocol
12
12
  module Header
13
13
  # The `accept-encoding` header represents a list of encodings that the client can accept.
14
14
  class AcceptEncoding < Split
15
- ParseError = Class.new(Error)
15
+ ParseError = Class.new(InvalidHeaderError)
16
16
 
17
17
  # https://tools.ietf.org/html/rfc7231#section-5.3.1
18
18
  QVALUE = /0(\.[0-9]{0,3})?|1(\.[0]{0,3})?/
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "split"
7
7
  require_relative "../quoted_string"
@@ -12,7 +12,7 @@ module Protocol
12
12
  module Header
13
13
  # The `accept-language` header represents a list of languages that the client can accept.
14
14
  class AcceptLanguage < Split
15
- ParseError = Class.new(Error)
15
+ ParseError = Class.new(InvalidHeaderError)
16
16
 
17
17
  # https://tools.ietf.org/html/rfc3066#section-2.1
18
18
  NAME = /\*|[A-Z]{1,8}(-[A-Z0-9]{1,8})*/i
@@ -2,6 +2,7 @@
2
2
 
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2026, by Samuel Williams.
5
+ # Copyright, 2026, by Robin Schroer.
5
6
 
6
7
  require_relative "../cookie"
7
8
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "split"
7
7
  require_relative "../quoted_string"
@@ -23,7 +23,7 @@ module Protocol
23
23
  # # => "sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=, md5=9bb58f26192e4ba00f01e2e7b136bbd8"
24
24
  # ```
25
25
  class Digest < Split
26
- ParseError = Class.new(Error)
26
+ ParseError = Class.new(InvalidHeaderError)
27
27
 
28
28
  # https://tools.ietf.org/html/rfc3230#section-4.3.2
29
29
  ENTRY = /\A(?<algorithm>[a-zA-Z0-9][a-zA-Z0-9\-]*)\s*=\s*(?<value>.*)\z/
@@ -10,7 +10,7 @@ module Protocol
10
10
  module Header
11
11
  # Represents a `range` request header.
12
12
  class Range
13
- ParseError = Class.new(Error)
13
+ ParseError = Class.new(InvalidHeaderError)
14
14
 
15
15
  TOKEN = /[!#$%&'*+\-.0-9A-Z^_`a-z|~]+/
16
16
  HEADER = /\A(?<unit>#{TOKEN})=(?<ranges>.*)\z/
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "split"
7
7
  require_relative "../quoted_string"
@@ -23,7 +23,7 @@ module Protocol
23
23
  # # => "db;dur=53.2, cache;dur=12.1;desc=\"Redis lookup\""
24
24
  # ```
25
25
  class ServerTiming < Split
26
- ParseError = Class.new(Error)
26
+ ParseError = Class.new(InvalidHeaderError)
27
27
 
28
28
  # https://www.w3.org/TR/server-timing/
29
29
  METRIC = /\A(?<name>[a-zA-Z0-9][a-zA-Z0-9_\-]*)(;(?<parameters>.*))?\z/
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2026, by Samuel Williams.
4
+ # Copyright, 2026, by Robin Schroer.
5
+ # Copyright, 2026, by Samuel Williams.
5
6
 
6
7
  require_relative "multiple"
7
8
  require_relative "../cookie"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2025, by Samuel Williams.
4
+ # Copyright, 2019-2026, by Samuel Williams.
5
5
 
6
6
  module Protocol
7
7
  module HTTP
@@ -14,7 +14,7 @@ module Protocol
14
14
  #
15
15
  # The `te` header allows a client to indicate which transfer encodings it can handle, and in what order of preference using quality factors.
16
16
  class TE < Split
17
- ParseError = Class.new(Error)
17
+ ParseError = Class.new(InvalidHeaderError)
18
18
 
19
19
  # Transfer encoding token pattern
20
20
  TOKEN = /[!#$%&'*+\-.0-9A-Z^_`a-z|~]+/
@@ -2,6 +2,7 @@
2
2
 
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2026, by Samuel Williams.
5
+ # Copyright, 2026, by Robin Schroer.
5
6
 
6
7
  require_relative "error"
7
8
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2025, by Samuel Williams.
4
+ # Copyright, 2018-2026, by Samuel Williams.
5
5
 
6
6
  module Protocol
7
7
  module HTTP
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2025, by Samuel Williams.
4
+ # Copyright, 2019-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "body/buffered"
7
7
  require_relative "body/reader"
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Protocol
7
7
  module HTTP
8
- VERSION = "0.71.0"
8
+ VERSION = "0.72.1"
9
9
  end
10
10
  end
data/lib/protocol/http.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2024, by Samuel Williams.
4
+ # Copyright, 2018-2026, by Samuel Williams.
5
5
 
6
6
  require_relative "http/version"
7
7
 
data/license.md CHANGED
@@ -12,6 +12,7 @@ Copyright, 2023-2024, by Thomas Morgan.
12
12
  Copyright, 2023, by Marcelo Junior.
13
13
  Copyright, 2024, by Earlopain.
14
14
  Copyright, 2025, by William T. Nelson.
15
+ Copyright, 2026, by Robin Schroer.
15
16
 
16
17
  Permission is hereby granted, free of charge, to any person obtaining a copy
17
18
  of this software and associated documentation files (the "Software"), to deal
data/readme.md CHANGED
@@ -30,6 +30,16 @@ Please see the [project documentation](https://socketry.github.io/protocol-http/
30
30
 
31
31
  Please see the [project releases](https://socketry.github.io/protocol-http/releases/index) for all releases.
32
32
 
33
+ ### v0.72.0
34
+
35
+ - Clarified body stream lifecycle and ownership, including the directional semantics of `Protocol::HTTP::Body::Stream#close_read`, `#close_write`, and `#close`, how premature input closure affects the associated HTTP exchange, and ownership of streams passed to `Streamable#call`.
36
+ - Introduce `Protocol::HTTP::InvalidHeaderError` for malformed or invalid headers, which can be treated as bad requests.
37
+
38
+ ### v0.71.0
39
+
40
+ - Parse all cookie pairs from `Cookie` header fields, including multiple semicolon-separated pairs within each field.
41
+ - Preserve `Set-Cookie` parsing as one cookie plus attributes/directives per header field.
42
+
33
43
  ### v0.70.0
34
44
 
35
45
  - Add stable preference ordering for weighted `Accept`, `Accept-Charset`, `Accept-Encoding`, `Accept-Language`, and `TE` values.
@@ -64,14 +74,6 @@ Please see the [project releases](https://socketry.github.io/protocol-http/relea
64
74
 
65
75
  - Add support for the HTTP `QUERY` method.
66
76
 
67
- ### v0.62.1
68
-
69
- - Fix handling of `Stream#read(0)`, it must return a mutable string (or clear the given buffer).
70
-
71
- ### v0.61.0
72
-
73
- - Introduce `Protocol::HTTP::RefusedError` for indicating a stream or request was refused before processing and can be safely retried. `RequestRefusedError` is provided as an alias for backwards compatibility.
74
-
75
77
  ## See Also
76
78
 
77
79
  - [protocol-http1](https://github.com/socketry/protocol-http1) — HTTP/1 client/server implementation using this
@@ -87,11 +89,29 @@ Please see the [project releases](https://socketry.github.io/protocol-http/relea
87
89
 
88
90
  We welcome contributions to this project.
89
91
 
90
- 1. Fork it.
92
+ 1. Fork the repository.
91
93
  2. Create your feature branch (`git checkout -b my-new-feature`).
92
- 3. Commit your changes (`git commit -am 'Add some feature'`).
94
+ 3. Commit your changes (`git commit -am 'Add some feature.'`).
93
95
  4. Push to the branch (`git push origin my-new-feature`).
94
- 5. Create new Pull Request.
96
+ 5. Create a new pull request.
97
+
98
+ ### Running Tests
99
+
100
+ To run the test suite:
101
+
102
+ ``` bash
103
+ $ bundle exec sus
104
+ ```
105
+
106
+ ### Making Releases
107
+
108
+ To prepare a release branch and open a pull request from an up-to-date `main`:
109
+
110
+ ``` bash
111
+ $ bundle exec bake gem:github:release:patch # or minor or major
112
+ ```
113
+
114
+ See [bake-gem-github](https://github.com/socketry/bake-gem-github) for setup, remote releases, and recovery.
95
115
 
96
116
  ### Developer Certificate of Origin
97
117
 
data/releases.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Releases
2
2
 
3
+ ## v0.72.0
4
+
5
+ - Clarified body stream lifecycle and ownership, including the directional semantics of `Protocol::HTTP::Body::Stream#close_read`, `#close_write`, and `#close`, how premature input closure affects the associated HTTP exchange, and ownership of streams passed to `Streamable#call`.
6
+ - Introduce `Protocol::HTTP::InvalidHeaderError` for malformed or invalid headers, which can be treated as bad requests.
7
+
8
+ ## v0.71.0
9
+
10
+ - Parse all cookie pairs from `Cookie` header fields, including multiple semicolon-separated pairs within each field.
11
+ - Preserve `Set-Cookie` parsing as one cookie plus attributes/directives per header field.
12
+
3
13
  ## v0.70.0
4
14
 
5
15
  - Add stable preference ordering for weighted `Accept`, `Accept-Charset`, `Accept-Encoding`, `Accept-Language`, and `TE` values.
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.71.0
4
+ version: 0.72.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -15,38 +15,10 @@ authors:
15
15
  - Genki Takiuchi
16
16
  - Marcelo Junior
17
17
  - Olle Jonsson
18
+ - Robin Schroer
18
19
  - Yuta Iwama
19
20
  bindir: bin
20
- cert_chain:
21
- - |
22
- -----BEGIN CERTIFICATE-----
23
- MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
24
- ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
25
- CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
26
- MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
27
- MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
28
- bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
29
- igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
30
- 9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
31
- sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
32
- e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
33
- XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
34
- RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
35
- tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
36
- zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
37
- xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
38
- BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
39
- aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
40
- aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
41
- cBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl
42
- xCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/
43
- c1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp
44
- 8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
45
- JkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP
46
- eX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt
47
- Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
48
- voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
49
- -----END CERTIFICATE-----
21
+ cert_chain: []
50
22
  date: 1980-01-02 00:00:00.000000000 Z
51
23
  dependencies: []
52
24
  executables: []
@@ -122,6 +94,8 @@ homepage: https://github.com/socketry/protocol-http
122
94
  licenses:
123
95
  - MIT
124
96
  metadata:
97
+ bug_tracker_uri: https://github.com/socketry/protocol-http/issues
98
+ changelog_uri: https://github.com/socketry/protocol-http/blob/main/releases.md
125
99
  documentation_uri: https://socketry.github.io/protocol-http/
126
100
  source_code_uri: https://github.com/socketry/protocol-http.git
127
101
  rdoc_options: []
@@ -138,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
112
  - !ruby/object:Gem::Version
139
113
  version: '0'
140
114
  requirements: []
141
- rubygems_version: 4.0.10
115
+ rubygems_version: 4.0.21
142
116
  specification_version: 4
143
117
  summary: Provides abstractions to handle HTTP protocols.
144
118
  test_files: []
checksums.yaml.gz.sig DELETED
@@ -1,2 +0,0 @@
1
- =��'j��#�轂��u�W��!h6�!鹑3Ow�9{�l���။s���;k�T�Ve me �?�O�n)��|ALL�\Tmh3��/�9 ��J� c����y��O�&F�}�L�F�)�fc
2
- �͋���<���]-���s?Yv֜g�LHD��Sq�%�`�������2=\�<���c�����8��T�ݓc�ѽ�9��9:mw�8QM���޽�pbL��Z/�!�^M�@0h��.� �"�����G�1�e,�����`k�oϼ5ƙ�|��;�hfS�٭�[�~���:�&�`\��L�j�u N��w��/r�+i+D��K_��3� �g�f�f�w:Ƨc�Z�����L] ,���ï
data.tar.gz.sig DELETED
Binary file
metadata.gz.sig DELETED
Binary file