Beispiel #1
0
        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();
            }
        }