private void OnNameResolved(NameResolutionResult dnsResult) {
				if (dnsResult.NetworkInterface == null) {
					if (filestream != null) {
						filestream.Close();
					}
					ctx.Post(result => {
						this.OnError(new ErrorEventArgs(new DownloadException("Network not available")));
					}, null);
					return;
				}

				HttpWebRequest request = (HttpWebRequest)WebRequest.CreateHttp(uri);
				request.Method = "GET";

				Logger.log("DownloadRequestHandler", "Downloading " + uri.AbsoluteUri + " asynchronously...");

				request.BeginGetResponse(async callbackResult => {
					DownloadFile df = (DownloadFile)callbackResult.AsyncState;

					try {
						HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
						Logger.log("DownloadRequestHandler", "Status: " + (int)response.StatusCode + " " + response.StatusDescription);
						if (response.Headers["Content-Length"] != null) {
							Logger.log("DownloadRequestHandler", "Content length: " + response.Headers["Content-Length"]);
						} else {
							Logger.log("DownloadRequestHandler", "Content length: unknown");
						}

						Stream responseStream = response.GetResponseStream();
						BinaryReader br = new BinaryReader(responseStream);
						int responseBufferSize = 4096;
						int responseBytesRead = 0;
						int responseTotalBytesRead = 0;
						byte[] responseBuffer = new byte[responseBufferSize];

						while ((responseBytesRead = br.Read(responseBuffer, 0, responseBuffer.Length)) > 0) {
							responseTotalBytesRead += responseBytesRead;
							await filestream.WriteAsync(responseBuffer, 0, responseBuffer.Length);
						}
						filestream.Close();

						Logger.log("DownloadRequestHandler", "Wrote " + responseTotalBytesRead + " bytes");

						ctx.Post(result => {
							df.OnComplete((DownloadFileEventArgs)result);
						}, new DownloadFileEventArgs(filestream.Name, responseTotalBytesRead));

					} catch (WebException ex) {
						DownloadException de;
						// check if we have an expired or self-signed cert
						if (ex.Status == WebExceptionStatus.UnknownError) {
							if (ex.Response.Headers.Count == 0 && uri.Scheme == "https") {
								de = new DownloadException("Invalid SSL certificate, returning a 400 Bad Request");
							} else {
								de = new DownloadException("File not found, returning a 404");
							}
						} else {
							de = new DownloadException("400 Bad Request: " + ex.Status.ToString());
						}
						if (filestream != null) {
							filestream.Close();
						}
						ctx.Post(result => {
							df.OnError(new ErrorEventArgs(de));
						}, null);
						Logger.log("DownloadRequestHandler", de.Message);
					}
				}, this);
			}
            private void OnNameResolved(NameResolutionResult dnsResult)
            {
                if (dnsResult.NetworkInterface == null)
                {
                    if (filestream != null)
                    {
                        filestream.Close();
                    }
                    ctx.Post(result => {
                        this.OnError(new ErrorEventArgs(new DownloadException("Network not available")));
                    }, null);
                    return;
                }

                HttpWebRequest request = (HttpWebRequest)WebRequest.CreateHttp(uri);

                request.Method = "GET";

                Logger.log("DownloadRequestHandler", "Downloading " + uri.AbsoluteUri + " asynchronously...");

                request.BeginGetResponse(async callbackResult => {
                    DownloadFile df = (DownloadFile)callbackResult.AsyncState;

                    try {
                        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
                        Logger.log("DownloadRequestHandler", "Status: " + (int)response.StatusCode + " " + response.StatusDescription);
                        if (response.Headers["Content-Length"] != null)
                        {
                            Logger.log("DownloadRequestHandler", "Content length: " + response.Headers["Content-Length"]);
                        }
                        else
                        {
                            Logger.log("DownloadRequestHandler", "Content length: unknown");
                        }

                        Stream responseStream      = response.GetResponseStream();
                        BinaryReader br            = new BinaryReader(responseStream);
                        int responseTotalBytesRead = 0;
                        byte[] responseBuffer      = br.ReadBytes(4096);

                        while (responseBuffer.Length > 0)
                        {
                            responseTotalBytesRead += responseBuffer.Length;
                            await filestream.WriteAsync(responseBuffer, 0, responseBuffer.Length);
                            responseBuffer = br.ReadBytes(4096);
                        }
                        filestream.Close();

                        Logger.log("DownloadRequestHandler", "Wrote " + responseTotalBytesRead + " bytes");

                        ctx.Post(result => {
                            df.OnComplete((DownloadFileEventArgs)result);
                        }, new DownloadFileEventArgs(filestream.Name, responseTotalBytesRead));
                    } catch (WebException ex) {
                        DownloadException de;
                        // check if we have an expired or self-signed cert
                        if (ex.Status == WebExceptionStatus.UnknownError)
                        {
                            if (ex.Response.Headers.Count == 0 && uri.Scheme == "https")
                            {
                                de = new DownloadException("Invalid SSL certificate, returning a 400 Bad Request");
                            }
                            else
                            {
                                de = new DownloadException("File not found, returning a 404");
                            }
                        }
                        else
                        {
                            de = new DownloadException("400 Bad Request: " + ex.Status.ToString());
                        }
                        if (filestream != null)
                        {
                            filestream.Close();
                        }
                        ctx.Post(result => {
                            df.OnError(new ErrorEventArgs(de));
                        }, null);
                        Logger.log("DownloadRequestHandler", de.Message);
                    }
                }, this);
            }