public async Task TestGetResponseTextAsync_NormalPost_Passed()
        {
            INetUtility net     = new NetUtility();
            var         request = net.CreateHttp("https://httpbin.org/post");

            request.Method      = HttpMethod.Post.Method;
            request.ContentType = "application/x-www-form-urlencoded";

            string name = "陳大文";

            using (var stream = await request.GetRequestStreamAsync())
                using (var writer = new StreamWriter(stream))
                {
                    string postData = "name=" + WebUtility.UrlEncode(name);
                    writer.Write(postData);
                }

            using (var response = await request.GetResponseAsync())
            {
                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                string content = await net.GetResponseTextAsync(response);

                var obj = new
                {
                    form = new
                    {
                        name = ""
                    }
                };
                obj = JsonConvert.DeserializeAnonymousType(content, obj);
                Assert.Equal(obj.form.name, name);
            }
        }
        public async Task TestGetResponseAsync_ErrorStatusCode_NoException()
        {
            INetUtility net     = new NetUtility();
            var         request = net.CreateHttp("https://httpbin.org/status/400");

            request.ContentType = "text/html";

            using (var response = await request.GetResponseAsync())
            {
                Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
            }
        }
        public async Task TestGetResponseAsync_InvalidUrl_NoException()
        {
            INetUtility net     = new NetUtility();
            var         request = net.CreateHttp("http://sf93h4f9h3sf3f39fh49.com/");

            request.ContentType = "text/html";

            using (var response = await request.GetResponseAsync())
            {
                Assert.Null(response);
            }
        }
        public void TestCreateHttp()
        {
            INetUtility net     = new NetUtility();
            var         request = net.CreateHttp("http://localhost:12345/");

            Assert.Equal("http://localhost:12345/", request.RequestUri.AbsoluteUri);

            request.Accept = "*/*";
            Assert.Equal("*/*", request.Accept);

            request.ContentType = "text/html";
            Assert.Equal("text/html", request.ContentType);

            request.Headers[HttpRequestHeader.Authorization] = "Bearer 12345";
            Assert.Equal(3, request.Headers.Count);             // because of Accept and ContentType
            Assert.Equal("Bearer 12345", request.Headers[HttpRequestHeader.Authorization]);

            request.Method = HttpMethod.Post.Method;
            Assert.Equal(HttpMethod.Post.Method, request.Method);
        }
        public async Task TestGetResponseTextAsync_GzippedData_Passed()
        {
            INetUtility net     = new NetUtility();
            var         request = net.CreateHttp("https://httpbin.org/gzip");

            request.ContentType = "application/json";

            using (var response = await request.GetResponseAsync())
            {
                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                string content = await net.GetResponseTextAsync(response);

                var obj = new
                {
                    gzipped = false
                };
                obj = JsonConvert.DeserializeAnonymousType(content, obj);
                Assert.True(obj.gzipped);
            }
        }