private void GetPullFileCallback(IAsyncResult asyncResult) { HttpWebResponse response = null; try { response = m_webRequest.EndGetResponse(asyncResult) as HttpWebResponse; } catch (WebException e) { if (!m_bCancel) { LOG.ERROR("EndGetResponse", e); response = (HttpWebResponse)e.Response; m_code = response != null?Convert.ToInt32(response.StatusCode) : 0; } else { LOG.INFO("Request was cancelled by user."); } } if (response == null || m_bCancel) { return; } Stream stream = response.GetResponseStream(); m_code = Convert.ToInt32(response.StatusCode); LOG.INFO("getResponseCode : " + m_code); m_strCookies = makeClientCookie(response); readHeaders(m_headers, response); copyHashtable(m_OutHeaders, m_headers); try { if (m_code == Convert.ToInt32(HttpStatusCode.OK)) { m_pulledFile.setPosTo(0); } if (m_code == Convert.ToInt32(HttpStatusCode.RequestedRangeNotSatisfiable)) { m_code = Convert.ToInt32(HttpStatusCode.PartialContent); } else { if (m_code >= 400 && m_code != Convert.ToInt32(HttpStatusCode.PartialContent)) { LOG.ERROR("Error retrieving data: " + m_code); if (m_code == Convert.ToInt32(HttpStatusCode.Unauthorized) && m_oSession != null) { LOG.ERROR("Unauthorize error.Client will be logged out"); m_oSession.logout(); } m_strRespBody = readFully(stream, getResponseEncoding()); LOG.TRACE("Response body: " + m_strRespBody); } else { int nRead = 0; byte[] byteBuffer = new byte[1024 * 20]; do { nRead = stream.Read(byteBuffer, 0, 1024 * 20); if (nRead > 0) { m_pulledFile.write(byteBuffer, nRead); m_pulledFile.flush(); m_nCurDownloadSize += nRead; } }while(!m_bCancel && nRead > 0); if (m_code == Convert.ToInt32(HttpStatusCode.OK) || (m_code == Convert.ToInt32(HttpStatusCode.PartialContent) && isFinishDownload(response.Headers["Content-Range"]))) { m_nCurDownloadSize = 0; } } } } finally { stream.Close(); response.Close(); m_respWaitEvent.Set(); } }