public void RemoveWebHookShouldSucceed()
        {
            WebHook[] inputWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa2"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa3")
            };

            AddWebHooks(inputWebHooks);

            WebHook webHookToRemove = _webHooksManager.WebHooks.First(h => h.HookAddress == "http://www.gothere.com/aaabbbbbbaaa2");
            _webHooksManager.RemoveWebHook(webHookToRemove.Id);

            WebHook[] expectedWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa3"),
            };
            AssertWebHooks(expectedWebHooks);

            webHookToRemove = _webHooksManager.WebHooks.First(h => h.HookAddress == "http://www.gothere.com/aaabbbbbbaaa");
            _webHooksManager.RemoveWebHook(webHookToRemove.Id);
            expectedWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa3")
            };
            AssertWebHooks(expectedWebHooks);
        }
        public void AddWebHookShouldSucceed()
        {
            WebHook[] inputWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa")
            };

            WebHook[] expectedWebHooks = inputWebHooks;

            IEnumerable<WebHook> webHooksAdded = AddWebHooks(inputWebHooks);

            AssertWebHooks(expectedWebHooks);

            AssertWebHook(expectedWebHooks[0], webHooksAdded.First());
        }
Beispiel #3
0
 public HttpResponseMessage Subscribe(WebHook webHook)
 {
     try
     {
         WebHook webHookAdded = _hooksManager.AddWebHook(webHook);
         return Request.CreateResponse(HttpStatusCode.Created, webHookAdded);
     }
     catch (ConflictException)
     {
         _tracer.Trace("Web hook with address {0} already exists".FormatCurrentCulture(webHook.HookAddress));
         return Request.CreateResponse(HttpStatusCode.Conflict);
     }
     catch (LockOperationException)
     {
         _tracer.Trace("Failed to acquire lock while subscribing {0}".FormatCurrentCulture(webHook.HookAddress));
         return Request.CreateResponse(HttpStatusCode.InternalServerError);
     }
 }
Beispiel #4
0
        public WebHook AddWebHook(WebHook webHook)
        {
            using (_tracer.Step("WebHooksManager.AddWebHook"))
            {
                if (!Uri.IsWellFormedUriString(webHook.HookAddress, UriKind.RelativeOrAbsolute))
                {
                    throw new FormatException(Resources.Error_InvalidHookAddress.FormatCurrentCulture(webHook.HookAddress));
                }

                WebHook createdWebHook = null;

                bool lockAcquired = _hooksLock.TryLockOperation(() =>
                {
                    var webHooks = new List<WebHook>(ReadWebHooksFromFile());
                    WebHook existingWebHook = webHooks.FirstOrDefault(h => String.Equals(h.HookAddress, webHook.HookAddress, StringComparison.OrdinalIgnoreCase));

                    if (existingWebHook == null)
                    {
                        // if web hook doesn't exist (by address) then add it
                        createdWebHook = new WebHook(webHook.HookEventType, webHook.HookAddress, id: DateTime.UtcNow.Ticks.ToString(), insecureSsl: webHook.InsecureSsl);
                        webHooks.Add(createdWebHook);
                        SaveHooksToFile(webHooks);

                        _tracer.Trace("Added web hook: type - {0}, address - {1}", createdWebHook.HookEventType, createdWebHook.HookAddress);
                    }
                    else if (String.Equals(webHook.HookEventType, existingWebHook.HookEventType, StringComparison.OrdinalIgnoreCase))
                    {
                        // if web hook exist with the same hook event type, return the existing one
                        createdWebHook = existingWebHook;
                    }
                    else
                    {
                        // if web hook exists but with a different hook event type then throw a conflict exception
                        throw new ConflictException();
                    }
                }, LockTimeout);

                VerifyLockAcquired(lockAcquired);

                return createdWebHook;
            }
        }
Beispiel #5
0
 private static async Task VerifyWebHook(ApplicationManager hookAppManager, WebHook expectedWebHook)
 {
     TestTracer.Trace("Verify web hook");
     WebHook actualWebHooks = await hookAppManager.WebHooksManager.GetWebHookAsync(expectedWebHook.Id);
     Assert.Equal(expectedWebHook.HookAddress, actualWebHooks.HookAddress);
     Assert.Equal(expectedWebHook.HookEventType, actualWebHooks.HookEventType);
 }
Beispiel #6
0
        private static HttpClient CreateHttpClient(WebHook webHook)
        {
            var webRequestHandler = new WebRequestHandler();

            var hookAddress = new Uri(webHook.HookAddress);
            string userInfo = hookAddress.UserInfo;
            if (userInfo != null)
            {
                string[] userInfos = userInfo.Split(':');
                if (userInfos.Length == 2)
                {
                    webRequestHandler.Credentials = new NetworkCredential(userInfos[0], userInfos[1]);
                }
            }

            if (webHook.InsecureSsl)
            {
                webRequestHandler.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
            }

            return new HttpClient(webRequestHandler)
            {
                Timeout = TimeSpan.FromSeconds(10)
            };
        }
Beispiel #7
0
        private async Task PublishToHookAsync(WebHook webHook, string jsonString)
        {
            using (HttpClient httpClient = CreateHttpClient(webHook))
            {
                using (var content = new StringContent(jsonString, System.Text.Encoding.UTF8, "application/json"))
                {
                    try
                    {
                        _tracer.Trace("Publish {0}#{1} to address - {2}, json - {3}, insecure - {4}", webHook.HookEventType, webHook.Id, webHook.HookAddress, jsonString, webHook.InsecureSsl);

                        webHook.LastPublishDate = DateTime.UtcNow;
                        webHook.LastContext = jsonString;

                        using (HttpResponseMessage response = await httpClient.PostAsync(webHook.HookAddress, content))
                        {
                            _tracer.Trace("Publish {0}#{1} to address - {2}, response - {3}", webHook.HookEventType, webHook.Id, webHook.HookAddress, response.StatusCode);

                            // Handle 410 responses by removing the web hook
                            if (response.StatusCode == HttpStatusCode.Gone)
                            {
                                RemoveWebHookNotUnderLock(webHook.Id);
                            }

                            webHook.LastPublishStatus = response.StatusCode.ToString();
                            webHook.LastPublishReason = response.ReasonPhrase;
                        }
                    }
                    catch (Exception ex)
                    {
                        _tracer.Trace("Error while publishing hook - {0}#{1}, to address - {1}", webHook.HookEventType, webHook.Id, webHook.HookAddress);
                        _tracer.TraceError(ex);

                        webHook.LastPublishStatus = "Failure";
                        webHook.LastPublishReason = ex.Message;
                    }
                }
            }
        }
Beispiel #8
0
        private static HttpClient CreateHttpClient(WebHook webHook)
        {
            HttpClient httpClient = null;

            if (webHook.InsecureSsl)
            {
                var webRequestHandler = new WebRequestHandler()
                {
                    ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
                };

                httpClient = new HttpClient(webRequestHandler);
            }
            else
            {
                httpClient = new HttpClient();
            }

            httpClient.Timeout = TimeSpan.FromSeconds(10);

            return httpClient;
        }
        public void AddSameAddressWebHookWithDifferentHookEventTypeShouldThrowConflictException()
        {
            WebHook[] inputWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa2"),
                new WebHook(HookEventTypes.PostDeployment + "_NewEvent", "http://www.gothere.com/aaabbbbbbaaa"),
            };

            WebHook[] expectedWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa2"),
            };

            Assert.Throws<ConflictException>(() => AddWebHooks(inputWebHooks));

            AssertWebHooks(expectedWebHooks);
        }
        public void Add3WebHooksShouldSucceed()
        {
            WebHook[] inputWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa2", "111", insecureSsl: false),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa3", "111", insecureSsl: true)
            };

            WebHook[] expectedWebHooks = inputWebHooks;

            AddWebHooks(inputWebHooks);

            AssertWebHooks(expectedWebHooks);
        }
 private static void AssertWebHook(WebHook expectedWebHook, WebHook actualWebHook)
 {
     Assert.Equal(expectedWebHook.HookEventType, actualWebHook.HookEventType);
     Assert.Equal(expectedWebHook.HookAddress, actualWebHook.HookAddress);
     Assert.Equal(expectedWebHook.InsecureSsl, actualWebHook.InsecureSsl);
     Assert.True(!String.IsNullOrEmpty(actualWebHook.Id), "Received empty id for web hook");
 }
        private IEnumerable<WebHook> AddWebHooks(WebHook[] webHooks)
        {
            List<WebHook> webHooksAdded = new List<WebHook>();

            foreach (var webHook in webHooks)
            {
                WebHook webHookAdded = _webHooksManager.AddWebHook(webHook);
                webHooksAdded.Add(webHookAdded);
                Thread.Sleep(1);
            }

            return webHooksAdded;
        }
 private void AssertWebHooks(WebHook[] expectedWebHooks)
 {
     IEnumerable<WebHook> webHooks = _webHooksManager.WebHooks;
     Assert.Equal(expectedWebHooks.Length, webHooks.Count());
     for (int i = 0; i < expectedWebHooks.Length; i++)
     {
         WebHook expectedWebHook = expectedWebHooks[i];
         WebHook actualWebHook = webHooks.Single(w => String.Equals(w.HookAddress, expectedWebHook.HookAddress, StringComparison.OrdinalIgnoreCase));
         AssertWebHook(expectedWebHooks[i], actualWebHook);
         AssertWebHook(expectedWebHooks[i], _webHooksManager.GetWebHook(actualWebHook.Id));
     }
 }
        public void AddSameAddressWebHookWithSameHookEventTypeShouldSucceed()
        {
            WebHook[] inputWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa2"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
            };

            WebHook[] expectedWebHooks = new WebHook[]
            {
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa"),
                new WebHook(HookEventTypes.PostDeployment, "http://www.gothere.com/aaabbbbbbaaa2"),
            };

            AddWebHooks(inputWebHooks);

            AssertWebHooks(expectedWebHooks);
        }