Skip to content

Commit fea9ad3

Browse files
committed
Make sure the message format doesn't change
When `use_message_serializer_for_metadata` is false, the message format should be enveloped in the same way it was in Rails 7.0 to make sure we don't have inconsistent formats.
1 parent ed873f1 commit fea9ad3

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

activesupport/lib/active_support/messages/metadata.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def serialize_with_metadata(data, **metadata)
3232

3333
if has_metadata && !use_message_serializer_for_metadata?
3434
data_string = serialize_to_json_safe_string(data)
35-
envelope = wrap_in_metadata_envelope({ "message" => data_string }, **metadata)
35+
envelope = wrap_in_metadata_legacy_envelope({ "message" => data_string }, **metadata)
3636
serialize_to_json(envelope)
3737
else
3838
data = wrap_in_metadata_envelope({ "data" => data }, **metadata) if has_metadata
@@ -68,6 +68,13 @@ def wrap_in_metadata_envelope(hash, expires_at: nil, expires_in: nil, purpose: n
6868
{ "_rails" => hash }
6969
end
7070

71+
def wrap_in_metadata_legacy_envelope(hash, expires_at: nil, expires_in: nil, purpose: nil)
72+
expiry = pick_expiry(expires_at, expires_in)
73+
hash["exp"] = expiry
74+
hash["pur"] = purpose
75+
{ "_rails" => hash }
76+
end
77+
7178
def extract_from_metadata_envelope(envelope, purpose: nil)
7279
hash = envelope["_rails"]
7380

activesupport/test/messages/message_verifier_metadata_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ class MessageVerifierMetadataTest < ActiveSupport::TestCase
8686
end
8787
end
8888

89+
test "messages keep the old format when use_message_serializer_for_metadata is false" do
90+
# Message generated by Rails 7.0 using:
91+
#
92+
# verifier = ActiveSupport::MessageVerifier.new("secret", serializer: JSON)
93+
# legacy_message = verifier.generate("legacy", purpose: "test")
94+
legacy_message = "eyJfcmFpbHMiOnsibWVzc2FnZSI6IklteGxaMkZqZVNJPSIsImV4cCI6bnVsbCwicHVyIjoidGVzdCJ9fQ==--53b1fc02f5b89b2da8c6ce94efa95f5cb656d975"
95+
96+
verifier = ActiveSupport::MessageVerifier.new("secret", serializer: JSON)
97+
98+
using_message_serializer_for_metadata(false) do
99+
assert_equal legacy_message, verifier.generate("legacy", purpose: "test")
100+
end
101+
end
102+
89103
private
90104
def make_codec(**options)
91105
ActiveSupport::MessageVerifier.new("secret", **options)

0 commit comments

Comments
 (0)