in csharp/rocketmq-client-csharp/MessageView.cs [92:197]
public static MessageView FromProtobuf(Proto.Message message, MessageQueue messageQueue = null)
{
var topic = message.Topic.Name;
var systemProperties = message.SystemProperties;
var messageId = systemProperties.MessageId;
var bodyDigest = systemProperties.BodyDigest;
var checkSum = bodyDigest.Checksum;
var raw = message.Body.ToByteArray();
var corrupted = false;
var type = bodyDigest.Type;
switch (type)
{
case Proto.DigestType.Crc32:
{
var expectedCheckSum = Force.Crc32.Crc32Algorithm.Compute(raw, 0, raw.Length).ToString("X");
if (!expectedCheckSum.Equals(checkSum))
{
corrupted = true;
}
break;
}
case Proto.DigestType.Md5:
{
var expectedCheckSum = Utilities.ComputeMd5Hash(raw);
if (!expectedCheckSum.Equals(checkSum))
{
corrupted = true;
}
break;
}
case Proto.DigestType.Sha1:
{
var expectedCheckSum = Utilities.ComputeSha1Hash(raw);
if (!expectedCheckSum.Equals(checkSum))
{
corrupted = true;
}
break;
}
case Proto.DigestType.Unspecified:
default:
{
Logger.LogError(
$"Unsupported message body digest algorithm," +
$"digestType={type}, topic={topic}, messageId={messageId}");
break;
}
}
var bodyEncoding = systemProperties.BodyEncoding;
var body = raw;
switch (bodyEncoding)
{
case Proto.Encoding.Gzip:
{
// Gzip
if (body[0] == 0x1f && body[1] == 0x8b)
{
body = Utilities.DecompressBytesGzip(raw);
}
// Zlib
else if (body[0] == 0x78 || body[0] == 0x79)
{
body = Utilities.DecompressBytesZlib(raw);
}
break;
}
case Proto.Encoding.Identity:
{
break;
}
case Proto.Encoding.Unspecified:
default:
{
Logger.LogError($"Unsupported message encoding algorithm," +
$" topic={topic}, messageId={messageId}, bodyEncoding={bodyEncoding}");
break;
}
}
var tag = systemProperties.HasTag ? systemProperties.Tag : null;
var messageGroup = systemProperties.HasMessageGroup ? systemProperties.MessageGroup : null;
DateTime? deliveryTime = null == systemProperties.DeliveryTimestamp
? null
: (DateTime?)TimeZoneInfo.ConvertTimeFromUtc(systemProperties.DeliveryTimestamp.ToDateTime(), TimeZoneInfo.Local);
var keys = systemProperties.Keys.ToList();
var bornHost = systemProperties.BornHost;
var bornTime =
TimeZoneInfo.ConvertTimeFromUtc(systemProperties.BornTimestamp.ToDateTime(), TimeZoneInfo.Local);
var deliveryAttempt = systemProperties.DeliveryAttempt;
var queueOffset = systemProperties.QueueOffset;
var properties = new Dictionary<string, string>();
foreach (var (key, value) in message.UserProperties)
{
properties.Add(key, value);
}
var receiptHandle = systemProperties.ReceiptHandle;
return new MessageView(messageId, topic, body, tag, messageGroup, deliveryTime, keys, properties, bornHost,
bornTime, deliveryAttempt, messageQueue, receiptHandle, queueOffset, corrupted);
}