internal static Uri ComposeUrl(IRequest iRequest)
        {
            Uri url          = iRequest.Endpoint;
            var resourcePath = iRequest.ResourcePath;

            if (resourcePath == null)
            {
                resourcePath = string.Empty;
            }
            else
            {
                if (resourcePath.StartsWith("//", StringComparison.Ordinal))
                {
                    resourcePath = resourcePath.Substring(2);
                }
                else if (resourcePath.StartsWith("/", StringComparison.Ordinal))
                {
                    resourcePath = resourcePath.Substring(1);
                }
            }

            var delim = "?";
            var sb    = new StringBuilder();

            if (iRequest.SubResources.Count > 0)
            {
                foreach (var subResource in iRequest.SubResources)
                {
                    sb.AppendFormat("{0}{1}", delim, subResource.Key);
                    if (subResource.Value != null)
                    {
                        sb.AppendFormat("={0}", subResource.Value);
                    }
                    delim = "&";
                }
            }

            if (iRequest.Parameters.Count > 0)
            {
                var queryString = AliyunSDKUtils.GetParametersAsString(iRequest.Parameters);
                sb.AppendFormat("{0}{1}", delim, queryString);
            }

            var parameterizedPath = string.Concat(resourcePath, sb);
            var uri = new Uri(url.AbsoluteUri + parameterizedPath);

            return(uri);
        }
        /// <summary>
        /// Creates the HttpWebRequest and configures the end point, content, user agent and proxy settings.
        /// </summary>
        /// <param name="requestContext">The async request.</param>
        /// <returns>The web request that actually makes the call.</returns>
        protected virtual IHttpRequest <TRequestContent> CreateWebRequest(IRequestContext requestContext)
        {
            IRequest request     = requestContext.Request;
            Uri      url         = AliyunServiceClient.ComposeUrl(request);
            var      httpRequest = _requestFactory.CreateHttpRequest(url);

            httpRequest.ConfigureRequest(requestContext);

            httpRequest.Method = request.HttpMethod;
            if (request.MayContainRequestBody())
            {
                if (request.Content == null && (request.ContentStream == null))
                {
                    string queryString = AliyunSDKUtils.GetParametersAsString(request.Parameters);
                    request.Content = Encoding.UTF8.GetBytes(queryString);
                }

                if (request.Content != null)
                {
                    request.Headers[HttpHeader.ContentLengthHeader] =
                        request.Content.Length.ToString(CultureInfo.InvariantCulture);
                }
                else if (request.ContentStream != null && !request.Headers.ContainsKey(HttpHeader.ContentLengthHeader))
                {
                    request.Headers[HttpHeader.ContentLengthHeader] =
                        request.ContentStream.Length.ToString(CultureInfo.InvariantCulture);
                }
            }
            else if (request.UseQueryString &&
                     (request.HttpMethod == "POST" ||
                      request.HttpMethod == "PUT" ||
                      request.HttpMethod == "DELETE"))
            {
                request.Content = new Byte[0];
            }

            return(httpRequest);
        }