private void PreparePostBody(WebRequest webRequest)
        {
            bool needsContentType = string.IsNullOrEmpty(webRequest.ContentType);

            if (HasFiles || AlwaysMultipartFormData)
            {
                if (needsContentType)
                {
                    webRequest.ContentType = GetMultipartFormContentType();
                }
                else if (!webRequest.ContentType.Contains("boundary"))
                {
                    webRequest.ContentType = webRequest.ContentType + "; boundary=" + FormBoundary;
                }
            }
            else if (HasBody)
            {
                if (needsContentType)
                {
                    webRequest.ContentType = RequestContentType;
                }
            }
            else if (HasParameters)
            {
                if (needsContentType)
                {
                    webRequest.ContentType = "application/x-www-form-urlencoded";
                }
                RequestBody = EncodeParameters();
            }
        }
 protected virtual HttpWebRequest CreateWebRequest(Uri url)
 {
     return((HttpWebRequest)WebRequest.Create(url));
 }
        private IHttp ConfigureHttp(IRestRequest request)
        {
            var http = new Http
            {
                Encoding = Encoding,
                AlwaysMultipartFormData = request.AlwaysMultipartFormData,
                UseDefaultCredentials   = request.UseDefaultCredentials,
                ResponseWriter          = request.ResponseWriter,
                AdvancedResponseWriter  = request.AdvancedResponseWriter,
                CookieContainer         = CookieContainer,
                AutomaticDecompression  = AutomaticDecompression,
                WebRequestConfigurator  = WebRequestConfigurator,
                Encode = Encode
            };

            var requestParameters = new List <Parameter> ();

            requestParameters.AddRange(request.Parameters);

            // move RestClient.DefaultParameters into Request.Parameters
            foreach (var defaultParameter in DefaultParameters)
            {
                var parameterExists =
                    request.Parameters.Any(p =>
                                           p.Name.Equals(defaultParameter.Name, StringComparison.InvariantCultureIgnoreCase) &&
                                           p.Type == defaultParameter.Type);

                if (AllowMultipleDefaultParametersWithSameName)
                {
                    var isMultiParameter = MultiParameterTypes.Any(pt => pt == defaultParameter.Type);
                    parameterExists = !isMultiParameter && parameterExists;
                }

                if (!parameterExists)
                {
                    requestParameters.Add(defaultParameter);
                }
            }

            // Add Accept header based on registered deserializers if none has been set by the caller.
            if (requestParameters.All(
                    p => !string.Equals(p.Name, "accept", StringComparison.InvariantCultureIgnoreCase)))
            {
                var accepts = string.Join(", ", AcceptTypes.ToArray());

                requestParameters.Add(new Parameter("Accept", accepts, ParameterType.HttpHeader));
            }

            http.Url             = BuildUri(request);
            http.Host            = BaseHost;
            http.PreAuthenticate = PreAuthenticate;
            http.UnsafeAuthenticatedConnectionSharing = UnsafeAuthenticatedConnectionSharing;

            var userAgent = UserAgent ?? http.UserAgent;

            http.UserAgent = userAgent.HasValue()
                                ? userAgent
                                : "RestSharp/" + Version;

            var timeout = request.Timeout != 0
                                ? request.Timeout
                                : Timeout;

            if (timeout != 0)
            {
                http.Timeout = timeout;
            }

            var readWriteTimeout = request.ReadWriteTimeout != 0
                                ? request.ReadWriteTimeout
                                : ReadWriteTimeout;

            if (readWriteTimeout != 0)
            {
                http.ReadWriteTimeout = readWriteTimeout;
            }

            http.FollowRedirects = FollowRedirects;

            if (ClientCertificates != null)
            {
                http.ClientCertificates = ClientCertificates;
            }

            http.MaxRedirects = MaxRedirects;
            http.CachePolicy  = CachePolicy;
            http.Pipelined    = Pipelined;

            if (request.Credentials != null)
            {
                http.Credentials = request.Credentials;
            }

            if (!string.IsNullOrEmpty(ConnectionGroupName))
            {
                http.ConnectionGroupName = ConnectionGroupName;
            }

            http.Headers = requestParameters
                           .Where(p => p.Type == ParameterType.HttpHeader)
                           .Select(p => new HttpHeader {
                Name = p.Name, Value = Convert.ToString(p.Value)
            })
                           .ToList();

            http.Cookies = requestParameters
                           .Where(p => p.Type == ParameterType.Cookie)
                           .Select(p => new HttpCookie {
                Name = p.Name, Value = Convert.ToString(p.Value)
            })
                           .ToList();

            http.Parameters = requestParameters
                              .Where(p => p.Type == ParameterType.GetOrPost && p.Value != null)
                              .Select(p => new HttpParameter {
                Name = p.Name, Value = Convert.ToString(p.Value)
            })
                              .ToList();

            http.Files = request.Files.Select(file => new HttpFile
            {
                Name          = file.Name,
                ContentType   = file.ContentType,
                Writer        = file.Writer,
                FileName      = file.FileName,
                ContentLength = file.ContentLength
            }).ToList();

            http.AddBody(requestParameters, Serializers, request.XmlSerializer, request.JsonSerializer);

            http.AllowedDecompressionMethods = request.AllowedDecompressionMethods;

            var proxy = Proxy ?? WebRequest.DefaultWebProxy;

            try
            {
                if (proxy == null)
                {
                    proxy = WebRequest.GetSystemWebProxy();
                }
            }
            catch (PlatformNotSupportedException)
            {
                // Ignore platform unsupported proxy detection
            }

            http.Proxy = proxy;

            http.RemoteCertificateValidationCallback = RemoteCertificateValidationCallback;

            return(http);
        }