skooma 0.2.3 → 0.3.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: 6263d8960b9a3b49287103608c6770c967b6fadfcf58d826df2a492c4dedbd35
4
- data.tar.gz: 5dd2c141d4baa7f0b95c1b3f3fbfd1afdafaae0097a1139956ba1c7e45f876a1
3
+ metadata.gz: 9f8caa0911924b17126cad7544d4c54e4fe3f819c6b21c3489cd47180bb69996
4
+ data.tar.gz: 052a2f72272a02b99cb44f62b6a1b1a319ca1c743742c66125d4da4ae9b402c1
5
5
  SHA512:
6
- metadata.gz: e5ddc4010685045a5b2a9908597096af07fb5ac21cce3e1c456568111fed4fc2fb708603be0a47dbd6e61bec0d64e0d85e27841ab36583f0fb61b73759d3f05b
7
- data.tar.gz: 1210a2ed7f56206369242baa147795acd3a6bc77aa6b719cb3ccc26ab33367a775921d0d94fd8741b651274afdc9183c20af194e4a289190d5968de239a9ae56
6
+ metadata.gz: 4392d35e7aade0d2683f38ef782ed6b2b980aee835ea489f173202ff75627a4cff4bc3ae522bb9e06ed6b69d7b073a08520902a3a6388cd22f3e8321bbedbb08
7
+ data.tar.gz: 990bfcb689cd4ad8f76060c955abf9ce01fd3513a54499592136045d1f87f3000575356b1d0e7ddea78b16cc76e516d099dfeda18c35c36426a6426e933068ea
data/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning].
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.0] - 2024-04-09
11
+
12
+ ### Changed
13
+
14
+ - BREAKING CHANGE: Pass `headers` parameter to registered `BodyParsers`. ([@skryukov])
15
+
16
+ ```ruby
17
+ # Before:
18
+ Skooma::BodyParsers.register("application/xml", ->(body) { Hash.from_xml(body) })
19
+ # After:
20
+ Skooma::BodyParsers.register("application/xml", ->(body, headers:) { Hash.from_xml(body) })
21
+ ```
22
+ ### Fixed
23
+
24
+ - Fix wrong path when combined with Rails exceptions_app. ([@ursm])
25
+
10
26
  ## [0.2.3] - 2024-01-18
11
27
 
12
28
  ### Added
@@ -68,8 +84,10 @@ end
68
84
  - Initial implementation. ([@skryukov])
69
85
 
70
86
  [@skryukov]: https://github.com/skryukov
87
+ [@ursm]: https://github.com/ursm
71
88
 
72
- [Unreleased]: https://github.com/skryukov/skooma/compare/v0.2.3...HEAD
89
+ [Unreleased]: https://github.com/skryukov/skooma/compare/v0.3.0...HEAD
90
+ [0.3.0]: https://github.com/skryukov/skooma/compare/v0.2.3...v0.3.0
73
91
  [0.2.3]: https://github.com/skryukov/skooma/compare/v0.2.2...v0.2.3
74
92
  [0.2.2]: https://github.com/skryukov/skooma/compare/v0.2.1...v0.2.2
75
93
  [0.2.1]: https://github.com/skryukov/skooma/compare/v0.2.0...v0.2.1
@@ -3,7 +3,7 @@
3
3
  module Skooma
4
4
  module BodyParsers
5
5
  class << self
6
- DEFAULT_PARSER = ->(body) { body }
6
+ DEFAULT_PARSER = ->(body, **_options) { body }
7
7
 
8
8
  def [](media_type)
9
9
  parsers[media_type.to_s.strip.downcase] || DEFAULT_PARSER
@@ -20,7 +20,7 @@ module Skooma
20
20
  self.parsers = {}
21
21
 
22
22
  module JSONParser
23
- def self.call(body)
23
+ def self.call(body, **_options)
24
24
  JSON.parse(body)
25
25
  rescue JSON::ParserError
26
26
  body
@@ -9,7 +9,7 @@ module Skooma
9
9
  def call(env, response = nil, with_response: true, with_request: true)
10
10
  result = {
11
11
  "method" => env["REQUEST_METHOD"].downcase,
12
- "path" => env["PATH_INFO"]
12
+ "path" => env["action_dispatch.original_path"] || env["PATH_INFO"]
13
13
  }
14
14
  result["request"] = map_request(env) if with_request
15
15
  result["response"] = map_response(response) if response && with_response
@@ -23,10 +23,19 @@ module Skooma
23
23
  {
24
24
  "query" => env["rack.request.query_string"] || env["QUERY_STRING"],
25
25
  "headers" => env.select { |k, _| k.start_with?("HTTP_") || PLAIN_HEADERS.include?(k) }.transform_keys { |k| k.sub(REGEXP_HTTP, "").split("_").map(&:capitalize).join("-") },
26
- "body" => env["RAW_POST_DATA"]
26
+ "body" => env["RAW_POST_DATA"] || read_rack_input(env["rack.input"])
27
27
  }
28
28
  end
29
29
 
30
+ def read_rack_input(input)
31
+ return nil unless input.respond_to?(:rewind)
32
+
33
+ input.rewind
34
+ raw_input = input.read
35
+ input.rewind
36
+ raw_input
37
+ end
38
+
30
39
  def map_response(response)
31
40
  status, headers, body = response.to_a
32
41
  full_body = +""
@@ -63,16 +63,16 @@ module Skooma
63
63
  data = {}
64
64
  data["status"] = JSONSkooma::JSONNode.new(value.fetch("status"), key: "status", parent: self)
65
65
  data["headers"] = Headers.new(value.fetch("headers", {}), key: "headers", parent: self)
66
- body_value = parse_body(value["body"], data["headers"]&.[]("Content-Type"))
66
+ body_value = parse_body(value["body"], data["headers"])
67
67
  data["body"] = Attribute.new(body_value, key: "body", parent: self)
68
68
  ["object", data]
69
69
  end
70
70
 
71
- def parse_body(body, content_type)
71
+ def parse_body(body, headers)
72
72
  return nil unless body
73
73
 
74
- parser = BodyParsers[content_type&.split(";")&.first]
75
- parser ? parser.call(body) : body
74
+ parser = BodyParsers[headers["Content-Type"]&.value&.split(";")&.first]
75
+ parser ? parser.call(body, headers: headers) : body
76
76
  end
77
77
  end
78
78
 
@@ -83,16 +83,16 @@ module Skooma
83
83
  data = {}
84
84
  data["query"] = Attribute.new(value.fetch("query", ""), key: "query", parent: self)
85
85
  data["headers"] = Headers.new(value.fetch("headers", {}), key: "headers", parent: self)
86
- body_value = parse_body(value["body"], data["headers"]&.[]("Content-Type"))
86
+ body_value = parse_body(value["body"], data["headers"])
87
87
  data["body"] = Attribute.new(body_value, key: "body", parent: self)
88
88
  ["object", data]
89
89
  end
90
90
 
91
- def parse_body(body, content_type)
91
+ def parse_body(body, headers)
92
92
  return nil unless body
93
93
 
94
- parser = BodyParsers[content_type&.split(";")&.first]
95
- parser ? parser.call(body) : body
94
+ parser = BodyParsers[headers["Content-Type"]&.value&.split(";")&.first]
95
+ parser ? parser.call(body, headers: headers) : body
96
96
  end
97
97
  end
98
98
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Skooma
4
- VERSION = "0.2.3"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skooma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-18 00:00:00.000000000 Z
11
+ date: 2024-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk