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