public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("Got GitHub Webhook.");

            string eventType = string.Empty;

            if (req.Headers.ContainsKey(EventType))
            {
                eventType = req.Headers[EventType];
                log.LogInformation($"Rec. event of type: {eventType}");
            }

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

            log.LogInformation($"Request body: {requestBody}");

            // Establishing connectivity to queue
            var azureStorageConnectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
            CloudStorageAccount csAccount    = CloudStorageAccount.Parse(azureStorageConnectionString);
            CloudQueueClient    cQueueClient = csAccount.CreateCloudQueueClient();
            CloudQueue          cQueue       = cQueueClient.GetQueueReference("scheduledprsqueue");

            // this env var should have an xml body containing an RSA key
            var xmlGHPrivateKey = Environment.GetEnvironmentVariable("GitHubPrivateKey");
            var handler         = new GitHubEventHandlers(log, xmlGHPrivateKey, AppId);

            // deserialize the payload
            var payload = JsonConvert.DeserializeObject <WebhookPayload>(requestBody);

            bool isHuman = payload?.Sender?.Type == "User"; // don't respond in an infinite loop

            if (payload != null && isHuman)
            {
                log.LogDebug("Deserialized the payload.");

                try
                {
                    switch (eventType)
                    {
                    case PullRequestEvent:
                        var prresult = CheckPRHasCommand(payload);
                        if (prresult != null)
                        {
                            log.LogInformation($"Got PR with command: {prresult.BranchName} {prresult.MergeTime}");
                            log.LogInformation($"Message insert result: " + InsertMessageToQueue(cQueue, prresult, TimeSpan.FromMinutes(5)));
                        }
                        break;

                    case IssueCommentEvent:     // same event as a PR comment, need to check that this comment is made on a PR and not an issue
                        // do a thing, but differently
                        var result = CheckCommentHasCommand(payload);
                        if (result != null)
                        {
                            // ack to the comment
                            await handler.AckAddToQueueAsync(result);

                            await handler.BlockMergeAsync(result);

                            log.LogInformation($"Got comment with command: {result.BranchName} {result.MergeTime}");
                            log.LogInformation($"Message insert result: " + InsertMessageToQueue(cQueue, result, TimeSpan.FromMinutes(5)));
                        }

                        // debug, this should be done in QueueExecutor
                        // MergePRAsync(log, xmlGHPrivateKey, result).GetAwaiter().GetResult();
                        break;
                    }
                }
                catch (Exception e)
                {
                    log.LogInformation(e, "Caught exception when processing payload.");
                }
            }
            return(new OkResult());
        }