private bool TryValidateRequestHeaders()

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;
        }