private void SendRequestForDownload(Stream outStream, ProgressCallbackHelper progressCallback, KiiHttpClientCallback callback)
        {
            SetSDKClientInfo();
            try
            {
                HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse();

                ApiResponse res = ParseResponseHeader(httpResponse);
                // read body
                ReadBodyStream(httpResponse, progressCallback, outStream);
                res.Body = "";

                callback(res, null);
            }
            catch (System.Net.WebException e)
            {
                Console.Write("Exception " + e.Message);
                System.Net.HttpWebResponse err = (System.Net.HttpWebResponse)e.Response;
                // read body
                string body = ReadBodyFromResponse(err);

                callback(null, KiiHttpUtils.TypedException((int)err.StatusCode, body));
            }
            catch (Exception e)
            {
                callback(null, e);
            }
        }
        private void SendRequest(Stream body, ProgressCallbackHelper progressCallback, KiiHttpClientCallback callback)
        {
            System.IO.Stream reqStream = null;
            try
            {
                long doneByte  = 0;
                long totalByte = body.Length;
                request.ContentLength = totalByte;

                reqStream = request.GetRequestStream();

                byte[] buffer = new byte[4096];
                int    count;
                while (true)
                {
                    count = body.Read(buffer, 0, buffer.Length);
                    if (count <= 0)
                    {
                        break;
                    }
                    reqStream.Write(buffer, 0, count);
                    doneByte += count;
                    if (doneByte > totalByte)
                    {
                        doneByte = totalByte;
                    }
                    progressCallback.NotifyProgress(doneByte, totalByte);
                }
            }
            catch (SystemException e)
            {
                callback(null, new NetworkException(e));
                return;
            }
            finally
            {
                if (reqStream != null)
                {
                    reqStream.Close();
                }
            }

            SendRequest(callback);
        }
 protected void ReadBodyStream(System.Net.HttpWebResponse response, ProgressCallbackHelper progressCallback, Stream outStream)
 {
     System.IO.Stream s = null;
     try
     {
         s = response.GetResponseStream();
         byte[] buffer = new byte[4096];
         int    count;
         long   doneByte  = 0;
         long   totalByte = response.ContentLength;
         while (true)
         {
             count = s.Read(buffer, 0, buffer.Length);
             if (count <= 0)
             {
                 break;
             }
             outStream.Write(buffer, 0, count);
             doneByte += count;
             if (doneByte > totalByte)
             {
                 doneByte = totalByte;
             }
             if (progressCallback != null)
             {
                 progressCallback.NotifyProgress(doneByte, totalByte);
             }
         }
     }
     catch (SystemException e)
     {
         throw new NetworkException(e);
     }
     finally
     {
         if (s != null)
         {
             s.Close();
         }
     }
 }