Esempio n. 1
0
        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());
            });
        }
Esempio n. 2
0
        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);
            }
        }