public void ResponsesIncludeContentHeaders()
        {
            using (var client = new HttpAbstractionClientFactory().Create(new TimeSpan(0, 5, 0), CancellationToken.None))
            {
                client.Uri = new Uri("http://httpbin.org/get");
                client.Method = HttpMethod.Get;

                var responseTask = client.SendAsync();
                responseTask.Wait();
                var response = responseTask.Result;

                Assert.IsNotNull(response);
                Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

                Assert.IsTrue(response.Headers.Contains("Content-Length"));
                Assert.IsTrue(response.Headers.Contains("Content-Type"));

                Assert.IsTrue(int.Parse(response.Headers["Content-Length"].First()) > 100);
                Assert.AreEqual("application/json", response.Headers["Content-Type"].First());

                Assert.IsNotNull(response.Content);
                var content = TestHelper.GetStringFromStream(response.Content);
                Assert.AreNotEqual(0, content.Length);
            }
        }
        public void CanMakeGetRequest()
        {
            using (var client = new HttpAbstractionClientFactory().Create())
            {
                client.Uri = new Uri("http://httpbin.org/get");
                client.Method = HttpMethod.Get;

                var responseTask = client.SendAsync();
                responseTask.Wait();
                var response = responseTask.Result;

                Assert.IsNotNull(response);
                Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

                Assert.IsNotNull(response.Content);
                var content = TestHelper.GetStringFromStream(response.Content);
                Assert.AreNotEqual(0, content.Length);
            }
        }
        public void CanMakePutRequest()
        {
            using (var client = new HttpAbstractionClientFactory().Create())
            {
                using (var content = TestHelper.CreateStream("Test Text"))
                {
                    client.Uri = new Uri("http://httpbin.org/put");
                    client.Method = HttpMethod.Put;
                    client.Content = content;

                    var responseTask = client.SendAsync();
                    responseTask.Wait();
                    var response = responseTask.Result;

                    Assert.IsNotNull(response);
                    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
                    
                    Assert.IsNotNull(response.Content);

                    var stringContent = TestHelper.GetStringFromStream(response.Content);
                    Assert.AreNotEqual(0, stringContent.Length);
                    Assert.IsTrue(stringContent.Contains("\"data\": \"Test Text\""));
                }
            }
        }
        public void RequestsCanSendHeaders()
        {
            using (var client = new HttpAbstractionClientFactory().Create())
            {
                client.Uri = new Uri("http://httpbin.org/get");
                client.Headers.Add("X-Test-Header","TEST");

                //Added in order to force httpbin not to cache the responses from any prior get requests/unit tests. 
                client.Headers.Add("Cache-Control", "max-age=0");

                var responseTask = client.SendAsync();
                
                responseTask.Wait();
                var response = responseTask.Result;
                Assert.IsNotNull(response);
                Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

                Assert.IsNotNull(response.Content);
                var content = TestHelper.GetStringFromStream(response.Content);
                Assert.AreNotEqual(0, content.Length);

                Assert.IsTrue(content.Contains("\"X-Test-Header\": \"TEST\""));
            }
        }
        public void RequestsHandlesHttpErrors()
        {
            using (var client = new HttpAbstractionClientFactory().Create())
            {
                client.Uri = new Uri("http://httpbin.org/status/404");

                var responseTask = client.SendAsync();
                responseTask.Wait();
                var response = responseTask.Result;

                Assert.IsNotNull(response);
                Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);

                var stringContent = TestHelper.GetStringFromStream(response.Content);

                Assert.AreEqual(string.Empty, stringContent);
            }
        }
        public void RequestsHonorsCancelationToken()
        {
            var token = new CancellationToken(true);
            var startTime = DateTime.Now;

            try
            {
                using (var client = new HttpAbstractionClientFactory().Create(token))
                {
                    client.Uri = new Uri("http://httpbin.org/delay/30000");
                    client.Timeout = TimeSpan.FromSeconds(31);

                    var responseTask = client.SendAsync();
                    responseTask.Wait();
                }
            }
            catch (AggregateException ex)
            {
                var inner = ex.InnerException;
               Assert.IsTrue(DateTime.Now - startTime < TimeSpan.FromSeconds(30));
               Assert.IsTrue(inner.Message.Contains("was canceled"));
            }
        }
        public void RequestsHonorsClientSideTimeout()
        {
             try
             {
                 using (var client = new HttpAbstractionClientFactory().Create(TimeSpan.FromMilliseconds(100)))
                 {
                     client.Uri = new Uri("http://httpbin.org/delay/30000");

                     var responseTask = client.SendAsync();
                     responseTask.Wait();
                 }
             }
             catch (AggregateException ex)
             {
                 var inner = ex.InnerException;
                 Assert.IsInstanceOfType(inner,typeof(TimeoutException));
                 Assert.IsTrue(inner.Message.Contains("failed to complete in the given timeout period"));
             }
        }
        public void CanMakeMultipleGetRequestsWithSameClient()
        {
            using (var client = new HttpAbstractionClientFactory().Create())
            {

                client.Uri = new Uri("http://httpbin.org/get");
                client.Method = HttpMethod.Get;

                var responseTask = client.SendAsync();
                responseTask.Wait();

                responseTask = client.SendAsync();
                responseTask.Wait();
            }
        }