private async Task MakeSingleRequest()

in Source/NuGetGallery.Monitoring/HttpMonitor.cs [253:298]


        private async Task<TimeResult> MakeSingleRequest(Uri url, string method, int timeout)
        {
            // Resolve the host
            var dnsResult = await Time(async () => 
                await Task.Factory
                    .FromAsync((cb, state) => Dns.BeginGetHostAddresses(url.Host, cb, state), res => Dns.EndGetHostAddresses(res), new object())
                    .TimeoutAfter(timeout, "DNS Resolution"));
            if (!dnsResult.IsSuccess)
            {
                return dnsResult;
            }

            var host = url.Host;
            url = (new UriBuilder(url) { Host = dnsResult.Result[0].ToString() }).Uri;

            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Host = host;
            request.Method = method;
            request.KeepAlive = false;
            Trace.WriteLine(String.Format("http {0} [{2}] {1}", method, url.AbsoluteUri, host));

            return await Time(async () =>
            {
                HttpWebResponse response;
                try
                {
                    response = (HttpWebResponse)(await request.GetResponseAsync().TimeoutAfter(timeout, "Web Request"));
                }
                catch (WebException wex)
                {
                    response = wex.Response as HttpWebResponse;
                    if (response == null)
                    {
                        throw;
                    }
                }
                using (var input = response.GetResponseStream())
                using (var memoryStream = new MemoryStream())
                {
                    // Read the whole stream just to make sure we get all the data
                    await input.CopyToAsync(memoryStream);
                }
                Trace.WriteLine(String.Format("http {0} {1}", (int)response.StatusCode, url.AbsoluteUri));
                return response;
            });
        }