public async Task CompressedRequestHandler_PutAsync_CompressesContent()
        {
            var requestUriString = "http://sometestdomain.com/someendpoint";

            var mh = new MockMessageHandler();

            mh.AddFixedResponse("PUT", new Uri(requestUriString), new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Created));

            var handler = new CompressedRequestHandler(mh);
            var client  = new System.Net.Http.HttpClient(handler);

            var uncompressedContent = "A compressible string. A compressible string. A compressible string. A compressible string.";
            var result = await client.PutAsync(requestUriString, new System.Net.Http.StringContent(uncompressedContent)).ConfigureAwait(false);

            var modifiedContent = await mh.Requests.Last().Content.ReadAsStringAsync().ConfigureAwait(false);

            Assert.IsTrue(modifiedContent.Length < uncompressedContent.Length);

            var stream = await mh.Requests.Last().Content.ReadAsStreamAsync().ConfigureAwait(false);

            var decompressStream    = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress);
            var reader              = new System.IO.StreamReader(decompressStream);
            var decompressedContent = reader.ReadToEnd();

            Assert.AreEqual(uncompressedContent, decompressedContent);
        }
        public async Task MockMessageHandler_ReturnsFixedResponse()
        {
            var requestUriString = "http://www.mytestdomain.com/";

            var responseContentString = "Hello World!";
            var responseMessage       = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new System.Net.Http.StringContent(responseContentString)
            };

            var handler = new MockMessageHandler();

            handler.AddFixedResponse(new Uri(requestUriString), responseMessage);

            var client = new System.Net.Http.HttpClient(handler);
            var result = await client.GetAsync(requestUriString);

            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            Assert.AreEqual(responseContentString, await result.Content.ReadAsStringAsync());

            var lastRequest = handler.Requests.Last();

            Assert.AreEqual("GET", lastRequest.Method.Method);
            Assert.AreEqual(requestUriString, lastRequest.RequestUri.ToString());
        }
        public async Task CompressedRequestHandler_PostAsync_WorksWithNullContent()
        {
            var requestUriString = "http://sometestdomain.com/someendpoint";

            var mh = new MockMessageHandler();

            mh.AddFixedResponse("POST", new Uri(requestUriString), new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Created));

            var handler = new CompressedRequestHandler(mh);
            var client  = new System.Net.Http.HttpClient(handler);

            var result = await client.PostAsync(requestUriString, null).ConfigureAwait(false);

            result.EnsureSuccessStatusCode();
        }
        public async Task CompressedRequestHandler_PostAsync_SetsContentEncodingHeader()
        {
            var requestUriString = "http://sometestdomain.com/someendpoint";

            var mh = new MockMessageHandler();

            mh.AddFixedResponse("POST", new Uri(requestUriString), new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Created));

            var handler = new CompressedRequestHandler(mh);
            var client  = new System.Net.Http.HttpClient(handler);

            var uncompressedContent = "A compressible string. A compressible string. A compressible string. A compressible string.";
            var result = await client.PostAsync(requestUriString, new System.Net.Http.StringContent(uncompressedContent)).ConfigureAwait(false);

            Assert.AreEqual("gzip", mh.Requests.Last().Content.Headers.ContentEncoding.First());
        }
        private static MockMessageHandler SetupOAuth2MockHandler()
        {
            var mockHandler = new MockMessageHandler();

            mockHandler.AddFixedResponse(new Uri("http://testsite.com/Token"), new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new System.Net.Http.StringContent(String.Empty, System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
            });
            var mockResponse = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Redirect)
            {
                Content = new System.Net.Http.StringContent("Normally this is a web page the user logs into, but this test is automated and skips that.", System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
            };

            mockResponse.Headers.Location = new Uri("http://testsite.com/AuthComplete?code=28770506516186843330");
            mockHandler.AddFixedResponse(new Uri("http://testsite.com/Authorize"), mockResponse);

            var tokenIssuingHandler = new MockResponseHandler();

            tokenIssuingHandler.CanHandleRequest = (request) => { return(request.Method.Method == "POST" && request.RequestUri.ToString() == "http://testsite.com/Token"); };
            tokenIssuingHandler.HandleRequest    = async(request) =>
            {
                var content = request.Content as System.Net.Http.FormUrlEncodedContent;
                if (content == null)
                {
                    return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
                }

                var contentParams = new Dictionary <string, string>();
                var contentStr    = await content.ReadAsStringAsync().ConfigureAwait(false);

                foreach (var kvp in contentStr.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var    parts = kvp.Split(new char[] { '=' });
                    var    key   = Uri.UnescapeDataString(parts[0]);
                    string value = null;
                    if (parts.Length > 1)
                    {
                        value = Uri.UnescapeDataString(parts[1]);
                    }

                    contentParams.Add(key, value);
                }

                var grantType = (from c in contentParams where c.Key == "grant_type" select c.Value).FirstOrDefault();

                if (grantType == OAuth2.OAuth2GrantTypes.AuthorizationCode)
                {
                    var code = (from c in contentParams where c.Key == "code" select c.Value).FirstOrDefault();

                    if (code != "28770506516186843330")
                    {
                        return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
                    }

                    return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
                    {
                        Content = new System.Net.Http.StringContent("{ token_type: \"Bearer\", access_token: \"123\", expires_in: \"3600\", refresh_token: \"456\" }", System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
                    });
                }
                else if (grantType == OAuth2GrantTypes.ClientCredentials)
                {
                    if (request.Headers.Authorization.Scheme == "Basic" && request.Headers.Authorization.Parameter == "OTg3NjU0MzIxOmFiY2RlZmdoaWxtbm9wcXJzdHV2emFiYw==")
                    {
                        return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
                        {
                            Content = new System.Net.Http.StringContent("{ token_type: \"Bearer\", access_token: \"123\", expires_in: \"3600\", refresh_token: \"456\" }", System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
                        });
                    }
                }

                return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
            };
            mockHandler.AddDynamicResponse(tokenIssuingHandler);

            var authCheckingHandler = new MockResponseHandler();

            authCheckingHandler.CanHandleRequest = (request) => { return(request.RequestUri.ToString() == "http://testsite.com/TestEndpoint"); };
            authCheckingHandler.HandleRequest    = (request) =>
            {
                if (request.Headers.Authorization == null || request.Headers.Authorization.Scheme != "Bearer" || request.Headers.Authorization.Parameter != "123")
                {
                    return(Task.FromResult(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized)));
                }

                return(Task.FromResult(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
                {
                    Content = new System.Net.Http.StringContent("Yay! You're authed.")
                }));
            };
            mockHandler.AddDynamicResponse(authCheckingHandler);
            return(mockHandler);
        }