in dotnet/src/Azure.Iot.Operations.Protocol/RPC/CommandExecutor.cs [367:436]
private bool TryValidateRequestHeaders(
MqttApplicationMessage requestMsg,
out CommandStatusCode? status,
out string? statusMessage,
out string? invalidPropertyName,
out string? invalidPropertyValue)
{
if (requestMsg.MessageExpiryInterval == default)
{
status = CommandStatusCode.BadRequest;
statusMessage = $"No message expiry interval present.";
invalidPropertyName = "Message Expiry";
invalidPropertyValue = null;
return false;
}
if (!MqttTopicProcessor.IsValidReplacement(requestMsg.ResponseTopic))
{
Trace.TraceError($"Command '{_commandName}' with CorrelationId {requestMsg.CorrelationData} specified invalid response topic '{requestMsg.ResponseTopic}'. The command response will not be published.");
status = null;
statusMessage = null;
invalidPropertyName = null;
invalidPropertyValue = null;
return false;
}
if (requestMsg.CorrelationData == null || requestMsg.CorrelationData.Length == 0)
{
status = CommandStatusCode.BadRequest;
statusMessage = $"No correlation data present.";
invalidPropertyName = "Correlation Data";
invalidPropertyValue = null;
return false;
}
if (!GuidExtensions.TryParseBytes(requestMsg.CorrelationData, out Guid? correlationId))
{
status = CommandStatusCode.BadRequest;
statusMessage = $"Correlation data bytes do not conform to a GUID.";
invalidPropertyName = "Correlation Data";
invalidPropertyValue = null;
return false;
}
string? requestProtocolVersion = requestMsg.UserProperties?.FirstOrDefault(p => p.Name == AkriSystemProperties.ProtocolVersion)?.Value;
if (!ProtocolVersion.TryParseProtocolVersion(requestProtocolVersion, out ProtocolVersion? protocolVersion))
{
status = CommandStatusCode.NotSupportedVersion;
statusMessage = $"Unparsable protocol version ({AkriSystemProperties.ProtocolVersion}) value provided: {requestProtocolVersion}.";
invalidPropertyName = null;
invalidPropertyValue = null;
return false;
}
if (!_supportedMajorProtocolVersions.Contains(protocolVersion!.MajorVersion))
{
status = CommandStatusCode.NotSupportedVersion;
statusMessage = $"Invalid or unsupported protocol version ({AkriSystemProperties.ProtocolVersion}) value provided: {requestProtocolVersion}.";
invalidPropertyName = null;
invalidPropertyValue = null;
return false;
}
status = null;
statusMessage = null;
invalidPropertyName = null;
invalidPropertyValue = null;
return true;
}