public async Task <HttpResponseMessage> RunAsync( [HttpTrigger(AuthorizationLevel.Anonymous, "POST")] HttpRequestMessage request, ILogger logger) { string eventName = request.Headers.GetValueOrDefault("X-GitHub-Event"); string deliveryId = request.Headers.GetValueOrDefault("X-GitHub-Delivery"); string signature = request.Headers.GetValueOrDefault("X-Hub-Signature"); logger.LogInformation("Webhook delivery: Delivery id = '{DeliveryId}', Event name = '{EventName}'", deliveryId, eventName); var payloadBytes = await request.Content.ReadAsByteArrayAsync(); if (!_payloadValidator.IsPayloadSignatureValid(payloadBytes, signature)) { logger.LogWarning("Invalid signature"); return(request.CreateErrorResponse(HttpStatusCode.BadRequest, new HttpError("Invalid signature"))); } if (eventName == "pull_request") { var payload = await DeserializeBody <PullRequestEventPayload>(request.Content); if (PullRequestActions.Contains(payload.Action)) { try { logger.LogInformation("Handling action '{PayloadAction}' for pull request {RepoName}#{PullRequestNumber}", payload.Action, payload.Repository.FullName, payload.Number); var connection = await _githubConnectionCache.GetConnectionAsync(payload.Installation.Id); var context = new PullRequestContext(payload.Repository.FullName, payload, connection, logger); await _pullRequestHandler.HandleWebhookEventAsync(context); logger.LogInformation("Finished handling action '{PayloadAction}' for pull request {RepoName}#{PullRequestNumber}", payload.Action, payload.Repository.FullName, payload.Number); } catch (Exception ex) { logger.LogError(ex, "Error processing pull request webhook event {DeliveryId}", deliveryId); return(request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(ex.Message))); } } else { logger.LogInformation("Ignoring pull request action '{PayloadAction}'", payload.Action); } } else { logger.LogInformation("Unknown event '{EventName}', ignoring", eventName); } return(request.CreateResponse(HttpStatusCode.NoContent)); }
public async Task <HttpResponseMessage> RunAsync( [HttpTrigger(AuthorizationLevel.Anonymous, "POST")] HttpRequestMessage request, ILogger logger) { string eventName = request.Headers.GetValueOrDefault("X-GitHub-Event"); string deliveryId = request.Headers.GetValueOrDefault("X-GitHub-Delivery"); string signature = request.Headers.GetValueOrDefault("X-Hub-Signature"); logger.LogInformation("Webhook delivery: Delivery id = '{DeliveryId}', Event name = '{EventName}'", deliveryId, eventName); var payloadBytes = await request.Content.ReadAsByteArrayAsync(); if (!_payloadValidator.IsPayloadSignatureValid(payloadBytes, signature)) { logger.LogWarning("Invalid signature"); return(request.CreateErrorResponse(HttpStatusCode.BadRequest, new HttpError("Invalid signature"))); } return(request.CreateResponse(HttpStatusCode.NoContent)); }