private static void SetRequestContent(HttpWebRequest webRequest, ServiceRequest serviceRequest,
                                              bool async, OssAction asyncCallback)
        {
            var data = serviceRequest.BuildRequestContent();

            if (data == null ||
                (serviceRequest.Method != HttpMethod.Put &&
                 serviceRequest.Method != HttpMethod.Post))
            {
                // Skip setting content body in this case.
                if (async)
                {
                    asyncCallback();
                }

                return;
            }

            // Write data to the request stream.
            long userSetContentLength = -1;

            if (serviceRequest.Headers.ContainsKey(HttpHeaders.ContentLength))
            {
                userSetContentLength = long.Parse(serviceRequest.Headers[HttpHeaders.ContentLength]);
            }

            long streamLength = data.Length - data.Position;

            webRequest.ContentLength = (userSetContentLength >= 0 &&
                                        userSetContentLength <= streamLength) ? userSetContentLength : streamLength;

            if (async)
            {
                webRequest.BeginGetRequestStream(
                    (ar) =>
                {
                    using (var requestStream = webRequest.EndGetRequestStream(ar))
                    {
                        IoUtils.WriteTo(data, requestStream, webRequest.ContentLength);
                    }
                    asyncCallback();
                }, null);
            }
            else
            {
                using (var requestStream = webRequest.GetRequestStream())
                {
                    IoUtils.WriteTo(data, requestStream, webRequest.ContentLength);
                }
            }
        }
        private static void BeginSetRequestContent(HttpWebRequest webRequest, ServiceRequest serviceRequest,
                                                   OssAction asyncCallback, ClientConfiguration clientConfiguration, HttpAsyncResult result)
        {
            var data = serviceRequest.BuildRequestContent();

            if (data == null ||
                (serviceRequest.Method != HttpMethod.Put &&
                 serviceRequest.Method != HttpMethod.Post))
            {
                // Skip setting content body in this case.
                try
                {
                    asyncCallback();
                }
                catch (Exception e)
                {
                    result.WebRequest.Abort();
                    result.Complete(e);
                }

                return;
            }

            // Write data to the request stream.
            long userSetContentLength = -1;

            if (serviceRequest.Headers.ContainsKey(HttpHeaders.ContentLength))
            {
                userSetContentLength = long.Parse(serviceRequest.Headers[HttpHeaders.ContentLength]);
            }

            if (serviceRequest.UseChunkedEncoding || !data.CanSeek) // when data cannot seek, we have to use chunked encoding as there's no way to set the length
            {
                webRequest.SendChunked = true;
                webRequest.AllowWriteStreamBuffering = false; // when using chunked encoding, the data is likely big and thus not use write buffer;
            }
            else
            {
                long streamLength = data.Length - data.Position;
                webRequest.ContentLength = (userSetContentLength >= 0 &&
                                            userSetContentLength <= streamLength) ? userSetContentLength : streamLength;
                if (webRequest.ContentLength > clientConfiguration.DirectWriteStreamThreshold)
                {
                    webRequest.AllowWriteStreamBuffering = false;
                }
            }

            webRequest.BeginGetRequestStream(
                (ar) =>
            {
                try
                {
                    using (var requestStream = webRequest.EndGetRequestStream(ar))
                    {
                        if (!webRequest.SendChunked)
                        {
                            IoUtils.WriteTo(data, requestStream, webRequest.ContentLength);
                        }
                        else
                        {
                            IoUtils.WriteTo(data, requestStream);
                        }
                    }
                    asyncCallback();
                }
                catch (Exception e)
                {
                    result.WebRequest.Abort();
                    result.Complete(e);
                }
            }, null);
        }