private void SubmissionHandler(IApplicationBuilder app) { app.Run(async context => { if (context.Request.Method != "POST") { return; } if (!context.Request.Query.TryGetValue("type", out var value)) { await context.Response.WriteAsync(WebhookResponse.AsErrorJson("no webhook type defined.")); return; } if (authKey != null) { if (!context.Request.Query.TryGetValue("key", out var auth)) { await context.Response.WriteAsync(WebhookResponse.AsErrorJson("no authorization provided.")); return; } if (auth != authKey) { await context.Response.WriteAsync(WebhookResponse.AsErrorJson("unauthorized.")); return; } } var type = value.FirstOrDefault(); if (!allWebhookEvents.TryGetValue(type, out var ev)) { await context.Response.WriteAsync(WebhookResponse.AsErrorJson("type was not found.")); return; } byte[] streamBytes = new byte[context.Request.ContentLength.Value]; await context.Request.Body.ReadAsync(streamBytes, 0, streamBytes.Length); string json = HttpUtility.UrlDecode(Encoding.UTF8.GetString(streamBytes)); Log.Debug($"Webhook accepted with type '{type}' with data '{json}'."); try { await ev.OnMessage(json, services); } catch (Exception e) { SentrySdk.CaptureException(e); Log.Error(e); } context.Response.ContentType = "application/json"; await context.Response.WriteAsync(WebhookResponse.AsSuccessJson()); }); }
private async Task OnMessageReceived(object channel, BasicDeliverEventArgs args) { WebhookResponse resp = null; try { string payload = Encoding.UTF8.GetString(args.Body); resp = JsonConvert.DeserializeObject <WebhookResponse>(payload); } catch (Exception e) { Log.Error(e); model.BasicReject(args.DeliveryTag, false); return; } Log.Message(resp.auth_code + " | received"); try { foreach (IWebhookEvent webhook in webhookEvents) { if (webhook.AcceptedAuthCodes.Contains(resp.auth_code)) { await webhook.OnMessage(resp); Log.Message($"processed packet with auth_code of '{resp.auth_code}' to {webhook.GetType().Name}"); } } if (OnMessage != null) { await OnMessage(resp); } model.BasicAck(args.DeliveryTag, false); } catch (RabbitException e) { var prop = model.CreateBasicProperties(); prop.Headers = new Dictionary <string, object>(); if (args.BasicProperties.Headers.TryGetValue("x-retry-count", out object value)) { int rCount = int.Parse(value.ToString() ?? "0") + 1; prop.Headers.Add("x-retry-count", rCount); if (rCount > 10) { return; } } else { prop.Headers.Add("x-retry-count", 1); } model.BasicPublish("miki", "*", false, prop, args.Body); } catch (Exception e) { Log.Error(e); model.BasicAck(args.DeliveryTag, false); } }