/
vshmidt
/
masstransit
Обзор
Документация
Войти
/
vshmidt
/
masstransit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/MassTransit.Newtonsoft/Serialization/EncryptedMessageDeserializer.cs
76 строк
3 KB
Chris Patterson
Fixed #4693 - UseEncryption with SQS to properly handle Base64 encoding on deserialization
09 окт 2023, 16:44
09 окт 2023, 16:44
b80cfc9
Код
Авторство
О чём код?
#nullable enable namespace MassTransit.Serialization { using System; using System.Net.Mime; using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Bson; public class EncryptedMessageDeserializer : IMessageDeserializer { readonly JsonSerializer _deserializer; readonly IObjectDeserializer _objectDeserializer; readonly ICryptoStreamProvider _provider; public EncryptedMessageDeserializer(JsonSerializer deserializer, ICryptoStreamProvider provider) { _deserializer = deserializer; _provider = provider; _objectDeserializer = new NewtonsoftObjectDeserializer(deserializer); } public void Probe(ProbeContext context) { var scope = context.CreateScope("encrypted"); scope.Add("contentType", EncryptedMessageSerializer.EncryptedContentType.MediaType); _provider.Probe(scope); } public ContentType ContentType => EncryptedMessageSerializer.EncryptedContentType; public ConsumeContext Deserialize(ReceiveContext receiveContext) { return new BodyConsumeContext(receiveContext, Deserialize(receiveContext.Body, receiveContext.TransportHeaders, receiveContext.InputAddress)); } public SerializerContext Deserialize(MessageBody body, Headers headers, Uri? destinationAddress = null) { try { var messageBody = body is StringMessageBody smb ? new Base64MessageBody(smb.GetString()) : body; using var stream = messageBody.GetStream(); using var cryptoStream = _provider.GetDecryptStream(stream, headers); using var jsonReader = new BsonDataReader(cryptoStream); var envelope = _deserializer.Deserialize<MessageEnvelope>(jsonReader); if (envelope == null) throw new SerializationException("The message envelope was not found."); return new NewtonsoftEncryptedSerializerContext(_deserializer, _objectDeserializer, envelope, ContentType, _provider); } catch (JsonSerializationException ex) { throw new SerializationException("A JSON serialization exception occurred while deserializing the message envelope", ex); } catch (SerializationException) { throw; } catch (Exception ex) { throw new SerializationException("An exception occurred while deserializing the message envelope", ex); } } public MessageBody GetMessageBody(string text) { return new Base64MessageBody(text); } } }