Esempio n. 1
0
        private static bool InternalTryUpload(string url, IEnumerable <HttpPostValue> blobs, HttpClientOptions options, HttpClientResponse response, HttpClientAsyncCallback callback)
        {
            if (options == null || response == null)
            {
                return(false);
            }
            HttpWebRequest request = null;
            bool           success = false;

            try
            {
                request = HttpClient.Create(url, options);
                ParameterizedThreadStart copyto = delegate(object state)
                {
                    HttpWebResponse wr = null;
                    Stream          rs = null;
                    try
                    {
                        if (!HttpClient.PreparationUpload(request, blobs))
                        {
                            callback?.Invoke(HttpClientError.UnableToUploadBLOB, null, -1);
                        }
                        else
                        {
                            using (wr = (HttpWebResponse)request.GetResponse())
                            {
                                HttpClient.Fill(wr, response);
                                using (rs = wr.GetResponseStream())
                                {
                                    Func <byte[], int, bool> callbackt = null;
                                    if (callback != null)
                                    {
                                        callbackt = (buffer, len) =>
                                        {
                                            HttpClientError error = HttpClientError.Success;
                                            if (len < 0)
                                            {
                                                error = HttpClientError.ReadStreamInterruption;
                                            }
                                            return(callback(error, buffer, len));
                                        };
                                    }
                                    success = HttpClient.CopyTo(rs, response, callbackt);
                                }
                            }
                        }
                        request.Abort();
                    }
                    catch (Exception)
                    {
                        if (wr != null && rs == null)
                        {
                            callback?.Invoke(HttpClientError.UnableToSendRequest, null, -1);
                        }
                        else if (rs != null)
                        {
                            callback?.Invoke(HttpClientError.UnableToGetResponseStream, null, -1);
                        }
                        else if (wr == null)
                        {
                            callback?.Invoke(HttpClientError.UnableOpenURL, null, -1);
                        }
                        if (rs != null)
                        {
                            rs.Close();
                        }
                        if (wr != null)
                        {
                            wr.Close();
                        }
                        if (request != null)
                        {
                            request.Abort();
                        }
                    }
                };
                if (!response.AsynchronousMode)
                {
                    copyto(response);
                }
                else
                {
                    (new Thread(copyto)
                    {
                        IsBackground = true, Priority = ThreadPriority.Lowest
                    }).Start(response);
                }
                return(success);
            }
            catch (Exception)
            {
                if (request != null)
                {
                    request.Abort();
                }
                return(false);
            }
        }