コード例 #1
0
        private static HttpRequestMessage BuildRequest(WebhookJob job)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, job.RequestUrl)
            {
                Content = new StringContent(job.RequestBody, Encoding.UTF8, "application/json")
            };

            request.Headers.Add("X-Signature", job.RequestSignature);
            request.Headers.Add("User-Agent", "Squidex Webhook");

            return(request);
        }
コード例 #2
0
        private async Task EnqueueJobAsync(string payload, ISchemaWebhookUrlEntity webhook, AppEvent contentEvent, string eventName, Instant now)
        {
            var signature = $"{payload}{webhook.SharedSecret}".Sha256Base64();

            var job = new WebhookJob
            {
                Id               = Guid.NewGuid(),
                AppId            = contentEvent.AppId.Id,
                RequestUrl       = webhook.Url,
                RequestBody      = payload,
                RequestSignature = signature,
                EventName        = eventName,
                Expires          = now.Plus(ExpirationTime),
                WebhookId        = webhook.Id
            };

            await webhookEventRepository.EnqueueAsync(job, now);
        }
コード例 #3
0
        public virtual async Task <(string Dump, WebhookResult Result, TimeSpan Elapsed)> SendAsync(WebhookJob job)
        {
            HttpRequestMessage  request  = BuildRequest(job);
            HttpResponseMessage response = null;

            var isTimeout = false;

            var watch = Stopwatch.StartNew();

            try
            {
                using (var client = new HttpClient {
                    Timeout = Timeout
                })
                {
                    response = await client.SendAsync(request);
                }
            }
            catch (TimeoutException)
            {
                isTimeout = true;
            }
            catch (OperationCanceledException)
            {
                isTimeout = true;
            }
            finally
            {
                watch.Stop();
            }

            var responseString = string.Empty;

            if (response != null)
            {
                responseString = await response.Content.ReadAsStringAsync();
            }

            var dump = DumpFormatter.BuildDump(request, response, job.RequestBody, responseString, watch.Elapsed);

            var result = WebhookResult.Failed;

            if (isTimeout)
            {
                result = WebhookResult.Timeout;
            }
            else if (response?.IsSuccessStatusCode == true)
            {
                result = WebhookResult.Success;
            }

            return(dump, result, watch.Elapsed);
        }