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