-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
using System.IO.Compression; | ||
using System.Text; | ||
|
||
namespace JustSaying.AwsTools.MessageHandling.Compression; | ||
|
||
class GzipMessageBodyCompressor : IMessageBodyCompressor | ||
{ | ||
public string ContentEncoding { get; } = "gzip,base64"; | ||
public string Compress(string messageBody) | ||
{ | ||
var contentBytes = Encoding.UTF8.GetBytes(messageBody); | ||
using var compressedStream = new MemoryStream(); | ||
using (var gZipStream = new GZipStream(compressedStream, CompressionMode.Compress)) | ||
Check warning on line 13 in src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs Codecov / codecov/patchsrc/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs#L11-L13
|
||
{ | ||
gZipStream.Write(contentBytes, 0, contentBytes.Length); | ||
} | ||
Check warning on line 16 in src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs Codecov / codecov/patchsrc/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs#L15-L16
|
||
|
||
return Convert.ToBase64String(compressedStream.ToArray()); | ||
} | ||
Check warning on line 19 in src/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs Codecov / codecov/patchsrc/JustSaying/AwsTools/MessageHandling/Compression/GzipMessageBodyCompressor.cs#L18-L19
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
using System.IO.Compression; | ||
using System.Text; | ||
|
||
namespace JustSaying.AwsTools.MessageHandling.Compression; | ||
|
||
class GzipMessageBodyDecompressor : IMessageBodyDecompressor | ||
{ | ||
public string ContentEncoding { get; } = "gzip,base64"; | ||
|
||
public string Decompress(string messageBody) | ||
{ | ||
var compressedBytes = Convert.FromBase64String(messageBody); | ||
using var inputStream = new MemoryStream(compressedBytes); | ||
using var outputStream = new MemoryStream(); | ||
using (var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress)) | ||
{ | ||
gZipStream.CopyTo(outputStream); | ||
} | ||
|
||
return Encoding.UTF8.GetString(outputStream.ToArray()); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace JustSaying.AwsTools.MessageHandling.Compression; | ||
|
||
internal interface IMessageBodyCompressor | ||
{ | ||
string ContentEncoding { get; } | ||
string Compress(string messageBody); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace JustSaying.AwsTools.MessageHandling.Compression; | ||
|
||
public interface IMessageBodyDecompressor | ||
{ | ||
string ContentEncoding { get; } | ||
string Decompress(string messageBody); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
namespace JustSaying.AwsTools.MessageHandling.Compression; | ||
|
||
public interface IMessageDecompressionRegistry | ||
{ | ||
IMessageBodyDecompressor GetDecompressor(string contentEncoding); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
namespace JustSaying.AwsTools.MessageHandling.Compression; | ||
|
||
public class MessageDecompressionRegistry : IMessageDecompressionRegistry | ||
{ | ||
private readonly IList<IMessageBodyDecompressor> _decompressors; | ||
|
||
public MessageDecompressionRegistry(IList<IMessageBodyDecompressor> decompressors) | ||
{ | ||
_decompressors = decompressors; | ||
} | ||
|
||
public IMessageBodyDecompressor GetDecompressor(string contentEncoding) | ||
{ | ||
return _decompressors.FirstOrDefault(x => x.ContentEncoding == contentEncoding); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList<JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor> decompressors) -> void | ||
JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList<JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor> decompressors) -> void | ||
JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.ContentEncoding.get -> string | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor.Decompress(string messageBody) -> string | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry | ||
JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.GetDecompressor(string contentEncoding) -> JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor | ||
JustSaying.AwsTools.MessageHandling.Compression.MessageDecompressionRegistry.MessageDecompressionRegistry(System.Collections.Generic.IList<JustSaying.AwsTools.MessageHandling.Compression.IMessageBodyDecompressor> decompressors) -> void | ||
JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, JustSaying.AwsTools.MessageHandling.Compression.IMessageDecompressionRegistry decompressionRegistry, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
using System.IO.Compression; | ||
using System.Text; | ||
using Amazon.SQS.Model; | ||
using JustSaying.AwsTools.MessageHandling; | ||
using JustSaying.AwsTools.MessageHandling.Compression; | ||
using JustSaying.AwsTools.MessageHandling.Dispatch; | ||
using JustSaying.Messaging.MessageSerialization; | ||
using JustSaying.Messaging.Monitoring; | ||
using JustSaying.TestingFramework; | ||
using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; | ||
using Microsoft.Extensions.Logging; | ||
|
||
namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; | ||
|
||
public class WhenDispatchingCompressedMessage | ||
{ | ||
[Fact] | ||
public async Task ShouldDecompressMessage() | ||
{ | ||
// Arrange | ||
var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; | ||
var messageSerializer = new MessageSerializationRegister( | ||
new NonGenericMessageSubjectProvider(), | ||
new SystemTextJsonSerializationFactory()); | ||
|
||
messageSerializer.AddSerializer<SimpleMessage>(); | ||
|
||
var payload = messageSerializer.Serialize(originalMessage, false); | ||
|
||
var memoryStream = new MemoryStream(); | ||
await using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) | ||
{ | ||
gzipStream.Write(Encoding.UTF8.GetBytes(payload)); | ||
} | ||
|
||
var compressedPayload = Convert.ToBase64String(memoryStream.ToArray()); | ||
|
||
var sqsMessage = new Message | ||
{ | ||
Body = compressedPayload, | ||
MessageAttributes = | ||
{ | ||
["Content-Encoding"] = new MessageAttributeValue { DataType = "String", StringValue = "gzip,base64" } | ||
} | ||
}; | ||
|
||
var decompressorRegistry = | ||
new MessageDecompressionRegistry( | ||
new List<IMessageBodyDecompressor> | ||
{ | ||
new GzipMessageBodyDecompressor() | ||
}); | ||
|
||
var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty<Message>())); | ||
var queueReader = new SqsQueueReader(queue); | ||
var messageContext = queueReader.ToMessageContext(sqsMessage); | ||
var middlewareMap = new MiddlewareMap(); | ||
var inspectableMiddleware = new InspectableMiddleware<SimpleMessage>(); | ||
middlewareMap.Add<SimpleMessage>("fake-queue-name", inspectableMiddleware); | ||
var messageDispatcher = new MessageDispatcher(messageSerializer, new NullOpMessageMonitor(), middlewareMap, decompressorRegistry, new LoggerFactory()); | ||
|
||
// Act | ||
await messageDispatcher.DispatchMessageAsync(messageContext, CancellationToken.None); | ||
|
||
// Assert | ||
var handledDecompressedMessage = inspectableMiddleware.Handler.ReceivedMessages.ShouldHaveSingleItem(); | ||
handledDecompressedMessage.Id.ShouldBe(originalMessage.Id); | ||
} | ||
} |