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;
});
}