public void MultipleExecuteAsync()
        {
            IClientHttpRequest request = this.CreateRequest("/status/ok", HttpMethod.GET);

            request.ExecuteAsync(null, null);
            request.ExecuteAsync(null, null);
        }
        public void CancelAsync()
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;

            IClientHttpRequest request = this.CreateRequest("/sleep/2", HttpMethod.GET);

            request.ExecuteAsync(null, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.IsTrue(args.Cancelled, "Invalid response");

                    WebException webEx = args.Error as WebException;
                    Assert.IsNotNull(webEx, "Invalid response exception");
                    Assert.AreEqual(WebExceptionStatus.RequestCanceled, webEx.Status, "Invalid response exception status");
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            request.CancelAsync();

            manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }
        }
        private void AssertHttpMethodAsync(String path, HttpMethod method)
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;

            IClientHttpRequest request = this.CreateRequest("/methods/" + path, method);

            request.Headers.ContentLength = 0;

            request.ExecuteAsync(null, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.IsNull(args.Error, "Invalid response");
                    Assert.IsFalse(args.Cancelled, "Invalid response");
                    Assert.AreEqual(HttpStatusCode.OK, args.Response.StatusCode, "Invalid status code");
                    Assert.AreEqual(path, args.Response.StatusDescription, "Invalid status description");
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }
        }
        public void StatusAsync()
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;

            IClientHttpRequest request = this.CreateRequest("/status/notfound", HttpMethod.GET);

            request.ExecuteAsync(null, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.IsNull(args.Error, "Invalid response");
                    Assert.IsFalse(args.Cancelled, "Invalid response");
                    Assert.AreEqual(HttpStatusCode.NotFound, args.Response.StatusCode, "Invalid status code");
                    Assert.AreEqual("Status NotFound", args.Response.StatusDescription, "Invalid status description");
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }
        }
        public void EchoAsync()
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;

            IClientHttpRequest request = this.CreateRequest("/echo", HttpMethod.PUT);

            request.Headers.ContentType = new MediaType("text", "plain", "utf-8");
            String headerName   = "MyHeader";
            String headerValue1 = "value1";

            request.Headers.Add(headerName, headerValue1);
            String headerValue2 = "value2";

            request.Headers.Add(headerName, headerValue2);

            byte[] body = Encoding.UTF8.GetBytes("Hello World");
            request.Body = delegate(Stream stream)
            {
                stream.Write(body, 0, body.Length);
            };

            request.ExecuteAsync(null, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.IsNull(args.Error, "Invalid response");
                    Assert.IsFalse(args.Cancelled, "Invalid response");
                    Assert.AreEqual(HttpStatusCode.OK, args.Response.StatusCode, "Invalid status code");
                    Assert.AreEqual("value1,value2", args.Response.Headers[headerName], "Header values not found");
                    using (BinaryReader reader = new BinaryReader(args.Response.Body))
                    {
                        byte[] result = reader.ReadBytes((int)args.Response.Headers.ContentLength);
                        Assert.AreEqual(body, result, "Invalid body");
                    }
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }
        }
        public void AsyncExecution()
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;

            NoOpRequestAsyncInterceptor interceptor1 = new NoOpRequestAsyncInterceptor();
            ChangeHeaderInterceptor     interceptor2 = new ChangeHeaderInterceptor();

            requestFactory = new InterceptingClientHttpRequestFactory(requestFactoryMock,
                                                                      new IClientHttpRequestInterceptor[] { interceptor1, interceptor2 });

            IClientHttpRequest request = requestFactory.CreateRequest(new Uri("http://example.com"), HttpMethod.GET);

            request.ExecuteAsync(null, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.IsNull(args.Error, "Invalid response");
                    Assert.IsFalse(args.Cancelled, "Invalid response");
                    Assert.AreSame(this.responseMock, args.Response, "Invalid response");
                    Assert.IsNotNull(args.Response.Headers.Get("AfterAsyncExecution"));
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }

            Assert.IsTrue(interceptor1.invoked);
            Assert.IsTrue(this.requestMock.executed);
            Assert.IsNotNull(responseMock.Headers.Get("AfterAsyncExecution"));
        }
        public void ChangeResponseAsync()
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;
            Object           state       = new Object();

            ChangeResponseInterceptor interceptor = new ChangeResponseInterceptor();

            requestFactory = new InterceptingClientHttpRequestFactory(requestFactoryMock,
                                                                      new IClientHttpRequestInterceptor[] { interceptor });

            IClientHttpRequest request = requestFactory.CreateRequest(new Uri("http://example.com"), HttpMethod.GET);

            request.ExecuteAsync(state, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.IsNull(args.Error, "Invalid response");
                    Assert.IsFalse(args.Cancelled, "Invalid response");
                    Assert.AreNotSame(this.responseMock, args.Response, "Invalid response");
                    Assert.AreEqual(state, args.UserState);
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }
        }
        public void NoAsyncExecution()
        {
            ManualResetEvent manualEvent = new ManualResetEvent(false);
            Exception        exception   = null;

            NoOpExecutionInterceptor    interceptor1 = new NoOpExecutionInterceptor();
            NoOpRequestAsyncInterceptor interceptor2 = new NoOpRequestAsyncInterceptor();

            requestFactory = new InterceptingClientHttpRequestFactory(requestFactoryMock,
                                                                      new IClientHttpRequestInterceptor[] { interceptor1, interceptor2 });

            IClientHttpRequest request = requestFactory.CreateRequest(new Uri("http://example.com"), HttpMethod.GET);

            request.ExecuteAsync(null, delegate(ClientHttpRequestCompletedEventArgs args)
            {
                try
                {
                    Assert.Fail("No Execution");
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    manualEvent.Set();
                }
            });

            //manualEvent.WaitOne();
            if (exception != null)
            {
                throw exception;
            }

            Assert.IsFalse(interceptor2.invoked);
            Assert.IsFalse(requestMock.executed);
        }