philiprehberger-header_kit 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1e00c5cf603e6f7db3b7ac63478c587d4d3f0dd54d40ee11cbcc730a9ea4bb9
4
- data.tar.gz: c58a1210d23ae79c1ac86cd6340c7b6f30c6f6f575eb82b9c33caff1c5306eb3
3
+ metadata.gz: 7515c78405c89a2690d8a4fc48b802bdf9c5b79dd9deae14fe07de8a8673d2df
4
+ data.tar.gz: ca05991394f985b4b5b0148a6db2c826bc9101eb04787b6f6adf9c4d2839ab1b
5
5
  SHA512:
6
- metadata.gz: dbc951e5c1cee317be92464e8c4639cbb65f963f87f61b2050b12ed1c75b2be29d7cd326514ce35472a36bcc53d61d8cc445581cc3e85ff24954345dd3100439
7
- data.tar.gz: eda78dd329146c43b11f44594c9fdc9fa5acf31352a77af7cc1e610f4ff80a6d21f4feb52119efc36a51058ba40aad15b89f0635cff908e7c39098ac3c5dfe4a
6
+ metadata.gz: 02ce3113575c5c98db4e4b010138861a983488db0e888b09644dfe6162b48af2864190b815f82d33d1e0b6cbf5855eed176b1ec6bd30fdd73966f7be59b538b1
7
+ data.tar.gz: 387dd665c493e2d308e3cb76581733691d231d2160e3c6ad6cee724a818470f3fb31e089dd607206680738508b204f5630c0c48fae4f1c05ed89ed97c2bd4057
data/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2026-04-04
11
+
12
+ ### Added
13
+
14
+ - `parse_retry_after` for parsing Retry-After headers (numeric seconds or HTTP date)
15
+
16
+ ## [0.3.1] - 2026-03-31
17
+
18
+ ### Changed
19
+ - Standardize README badges, support section, and license format
20
+
10
21
  ## [0.3.0] - 2026-03-31
11
22
 
12
23
  ### Added
data/README.md CHANGED
@@ -2,12 +2,7 @@
2
2
 
3
3
  [![Tests](https://github.com/philiprehberger/rb-header-kit/actions/workflows/ci.yml/badge.svg)](https://github.com/philiprehberger/rb-header-kit/actions/workflows/ci.yml)
4
4
  [![Gem Version](https://badge.fury.io/rb/philiprehberger-header_kit.svg)](https://rubygems.org/gems/philiprehberger-header_kit)
5
- [![GitHub release](https://img.shields.io/github/v/release/philiprehberger/rb-header-kit)](https://github.com/philiprehberger/rb-header-kit/releases)
6
5
  [![Last updated](https://img.shields.io/github/last-commit/philiprehberger/rb-header-kit)](https://github.com/philiprehberger/rb-header-kit/commits/main)
7
- [![License](https://img.shields.io/github/license/philiprehberger/rb-header-kit)](LICENSE)
8
- [![Bug Reports](https://img.shields.io/github/issues/philiprehberger/rb-header-kit/bug)](https://github.com/philiprehberger/rb-header-kit/issues?q=is%3Aissue+is%3Aopen+label%3Abug)
9
- [![Feature Requests](https://img.shields.io/github/issues/philiprehberger/rb-header-kit/enhancement)](https://github.com/philiprehberger/rb-header-kit/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)
10
- [![Sponsor](https://img.shields.io/badge/sponsor-GitHub%20Sponsors-ec6cb9)](https://github.com/sponsors/philiprehberger)
11
6
 
12
7
  HTTP header parsing, construction, and content negotiation
13
8
 
@@ -186,6 +181,16 @@ Philiprehberger::HeaderKit.parse_via('1.1 vegur, 1.0 fred')
186
181
  # => [{protocol: "1.1", host: "vegur"}, {protocol: "1.0", host: "fred"}]
187
182
  ```
188
183
 
184
+ ### Parse Retry-After
185
+
186
+ ```ruby
187
+ Philiprehberger::HeaderKit.parse_retry_after("120")
188
+ # => {seconds: 120}
189
+
190
+ Philiprehberger::HeaderKit.parse_retry_after("Fri, 04 Apr 2026 12:00:00 GMT")
191
+ # => {date: 2026-04-04 12:00:00 UTC}
192
+ ```
193
+
189
194
  ## API
190
195
 
191
196
  | Method | Description |
@@ -209,6 +214,7 @@ Philiprehberger::HeaderKit.parse_via('1.1 vegur, 1.0 fred')
209
214
  | `HeaderKit.security_headers(**options)` | Generate recommended security headers |
210
215
  | `HeaderKit.parse_forwarded(header)` | Parse RFC 7239 Forwarded header |
211
216
  | `HeaderKit.parse_via(header)` | Parse Via header into structured entries |
217
+ | `HeaderKit.parse_retry_after(header)` | Parse Retry-After header (seconds or HTTP date) |
212
218
 
213
219
  ## Development
214
220
 
@@ -220,10 +226,21 @@ bundle exec rubocop
220
226
 
221
227
  ## Support
222
228
 
223
- If you find this package useful, consider giving it a star on GitHub — it helps motivate continued maintenance and development.
229
+ If you find this project useful:
230
+
231
+ ⭐ [Star the repo](https://github.com/philiprehberger/rb-header-kit)
232
+
233
+ 🐛 [Report issues](https://github.com/philiprehberger/rb-header-kit/issues?q=is%3Aissue+is%3Aopen+label%3Abug)
234
+
235
+ 💡 [Suggest features](https://github.com/philiprehberger/rb-header-kit/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)
236
+
237
+ ❤️ [Sponsor development](https://github.com/sponsors/philiprehberger)
238
+
239
+ 🌐 [All Open Source Projects](https://philiprehberger.com/open-source-packages)
240
+
241
+ 💻 [GitHub Profile](https://github.com/philiprehberger)
224
242
 
225
- [![LinkedIn](https://img.shields.io/badge/Philip%20Rehberger-LinkedIn-0A66C2?logo=linkedin)](https://www.linkedin.com/in/philiprehberger)
226
- [![More packages](https://img.shields.io/badge/more-open%20source%20packages-blue)](https://philiprehberger.com/open-source-packages)
243
+ 🔗 [LinkedIn Profile](https://www.linkedin.com/in/philiprehberger)
227
244
 
228
245
  ## License
229
246
 
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Philiprehberger
6
+ module HeaderKit
7
+ module RetryAfter
8
+ module_function
9
+
10
+ def parse(header)
11
+ return nil if header.nil? || header.empty?
12
+
13
+ if header.match?(/\A\d+\z/)
14
+ { seconds: header.to_i }
15
+ else
16
+ { date: Time.httpdate(header) }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Philiprehberger
4
4
  module HeaderKit
5
- VERSION = '0.3.0'
5
+ VERSION = '0.4.0'
6
6
  end
7
7
  end
@@ -14,6 +14,7 @@ require_relative 'header_kit/negotiation'
14
14
  require_relative 'header_kit/cors'
15
15
  require_relative 'header_kit/security'
16
16
  require_relative 'header_kit/forwarded'
17
+ require_relative 'header_kit/retry_after'
17
18
 
18
19
  module Philiprehberger
19
20
  module HeaderKit
@@ -174,5 +175,16 @@ module Philiprehberger
174
175
  def self.parse_via(header)
175
176
  Forwarded.parse_via(header)
176
177
  end
178
+
179
+ # Parse a Retry-After header.
180
+ #
181
+ # Returns a hash with :seconds (Integer) for numeric values,
182
+ # or :date (Time) for HTTP date values. Returns nil for nil/empty input.
183
+ #
184
+ # @param header [String] the Retry-After header value
185
+ # @return [Hash, nil] hash with :seconds or :date key, or nil
186
+ def self.parse_retry_after(header)
187
+ RetryAfter.parse(header)
188
+ end
177
189
  end
178
190
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: philiprehberger-header_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philip Rehberger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-31 00:00:00.000000000 Z
11
+ date: 2026-04-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Parse and build Accept, Accept-Language, Accept-Encoding, Authorization,
14
14
  Cache-Control, Content-Type, Cookie, Link, CORS, Forwarded, and Via HTTP headers.
@@ -35,6 +35,7 @@ files:
35
35
  - lib/philiprehberger/header_kit/forwarded.rb
36
36
  - lib/philiprehberger/header_kit/link.rb
37
37
  - lib/philiprehberger/header_kit/negotiation.rb
38
+ - lib/philiprehberger/header_kit/retry_after.rb
38
39
  - lib/philiprehberger/header_kit/security.rb
39
40
  - lib/philiprehberger/header_kit/version.rb
40
41
  homepage: https://philiprehberger.com/open-source-packages/ruby/philiprehberger-header_kit