internal static void NormalizeRawRequest()

in src/Google.Cloud.Functions.Framework/GcfEvents/GcfConverters.cs [316:367]


            internal static void NormalizeRawRequest(Request request, string path, ILogger logger)
            {
                // Non-raw-Pub/Sub path: just a no-op
                if (request.RawPubSubMessage is null && request.RawPubSubSubscription is null)
                {
                    return;
                }
                if (request.RawPubSubMessage is null || request.RawPubSubSubscription is null)
                {
                    throw new ConversionException("Request is malformed; it must contain both 'message' and 'subscription' properties or neither.");
                }
                if (request.Data is object ||
                    request.Domain is object ||
                    request.Context is object ||
                    request.EventId is object ||
                    request.EventType is object ||
                    request.Params is object ||
                    request.Timestamp is object)
                {
                    throw new ConversionException("Request is malformed; raw Pub/Sub request must contain only 'message' and 'subscription' properties.");
                }
                if (!request.RawPubSubMessage.TryGetValue("messageId", out var messageIdObj) || !(messageIdObj is JsonElement messageIdElement) ||
                    messageIdElement.ValueKind != JsonValueKind.String)
                {
                    throw new ConversionException("Request is malformed; raw Pub/Sub message must contain a 'message.messageId' string property.");
                }
                request.EventId = messageIdElement.GetString();
                request.EventType = GcfPubSubTopicPublishType;
                // Skip the leading / in the path
                path = path.Length == 0 ? "" : path.Substring(1);
                var topicPathMatch = PubSubResourcePattern.Match(path);
                if (topicPathMatch.Success)
                {
                    request.Resource = path;
                }
                else
                {
                    // TODO: Is it okay to log a warning on every request, or should we only log once (ever?)
                    logger.LogWarning("Request path did not represent a Pub/Sub topic name. The event will contain the unknown topic name of '{name}'", DefaultRawPubSubTopic);
                    request.Resource = DefaultRawPubSubTopic;
                }
                request.Data = request.RawPubSubMessage;
                if (request.RawPubSubMessage.TryGetValue("publishTime", out var publishTime) &&
                    publishTime is JsonElement publishTimeElement &&
                    publishTimeElement.ValueKind == JsonValueKind.String &&
                    DateTimeOffset.TryParseExact(publishTimeElement.GetString(), "yyyy-MM-dd'T'HH:mm:ss.FFFFFF'Z'", CultureInfo.InvariantCulture,
                        DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
                        out var timestamp))
                {
                    request.Timestamp = timestamp;
                }
            }