public static void DisposeAndClearHandle(ref SafeCurlSlistHandle curlHandle)
 {
     if (curlHandle != null)
     {
         curlHandle.Dispose();
         curlHandle = null;
     }
 }
Exemple #2
0
 private static void AddRequestHeaders(HttpHeaders headers, SafeCurlSlistHandle handle)
 {
     foreach (KeyValuePair <string, IEnumerable <string> > header in headers)
     {
         string headerStr = header.Key + ": " + headers.GetHeaderString(header.Key);
         if (!Interop.libcurl.curl_slist_append(handle, headerStr))
         {
             throw CreateHttpRequestException();
         }
     }
 }
            private void SetRequestHeaders()
            {
                HttpHeaders contentHeaders = null;

                if (RequestMessage.Content != null)
                {
                    SetChunkedModeForSend(RequestMessage);

                    // TODO: Content-Length header isn't getting correctly placed using ToString()
                    // This is a bug in HttpContentHeaders that needs to be fixed.
                    if (RequestMessage.Content.Headers.ContentLength.HasValue)
                    {
                        long contentLength = RequestMessage.Content.Headers.ContentLength.Value;
                        RequestMessage.Content.Headers.ContentLength = null;
                        RequestMessage.Content.Headers.ContentLength = contentLength;
                    }
                    contentHeaders = RequestMessage.Content.Headers;
                }

                var slist = new SafeCurlSlistHandle();

                // Add request and content request headers
                if (RequestMessage.Headers != null)
                {
                    AddRequestHeaders(RequestMessage.Headers, slist);
                }
                if (contentHeaders != null)
                {
                    AddRequestHeaders(contentHeaders, slist);
                }

                // Since libcurl always adds a Transfer-Encoding header, we need to explicitly block
                // it if caller specifically does not want to set the header
                if (RequestMessage.Headers.TransferEncodingChunked.HasValue &&
                    !RequestMessage.Headers.TransferEncodingChunked.Value)
                {
                    if (!Interop.libcurl.curl_slist_append(slist, NoTransferEncoding))
                    {
                        throw CreateHttpRequestException();
                    }
                }

                if (!slist.IsInvalid)
                {
                    SetCurlOption(CURLoption.CURLOPT_HTTPHEADER, slist);
                    _requestHeaders = slist;
                }
                else
                {
                    slist.Dispose();
                }
            }
Exemple #4
0
        /// <summary>
        /// Add request headers to curl API
        /// </summary>
        /// <param name="headers"></param>
        /// <param name="handle"></param>
        /// <param name="rawHandle"></param>
        private static void AddRequestHeaders(HttpHeaders headers, SafeCurlSlistHandle handle, ref IntPtr rawHandle)
        {
            foreach (KeyValuePair <string, IEnumerable <string> > header in headers)
            {
                string headerStr = header.Key + ": " + headers.GetHeaderString(header.Key);
                rawHandle = Interop.libcurl.curl_slist_append(rawHandle, headerStr);

                if (rawHandle == null)
                {
                    throw new HttpRequestException(SR.net_http_client_execution_error);
                }

                handle.SetHandle(rawHandle);
            }
        }
Exemple #5
0
        private SafeCurlSlistHandle SetRequestHeaders(SafeCurlHandle handle, HttpRequestMessage request)
        {
            SafeCurlSlistHandle retVal = new SafeCurlSlistHandle();

            if (request.Headers == null)
            {
                return(retVal);
            }

            HttpHeaders contentHeaders = null;

            if (request.Content != null)
            {
                SetChunkedModeForSend(request);

                // TODO: Content-Length header isn't getting correctly placed using ToString()
                // This is a bug in HttpContentHeaders that needs to be fixed.
                if (request.Content.Headers.ContentLength.HasValue)
                {
                    long contentLength = request.Content.Headers.ContentLength.Value;
                    request.Content.Headers.ContentLength = null;
                    request.Content.Headers.ContentLength = contentLength;
                }
                contentHeaders = request.Content.Headers;
            }

            bool gotReference = false;

            try
            {
                retVal.DangerousAddRef(ref gotReference);
                IntPtr rawHandle = IntPtr.Zero;

                if (request.Headers != null)
                {
                    // Add request headers
                    AddRequestHeaders(request.Headers, retVal, ref rawHandle);
                }

                if (contentHeaders != null)
                {
                    // Add content request headers
                    AddRequestHeaders(contentHeaders, retVal, ref rawHandle);
                }

                // Since libcurl always adds a Transfer-Encoding header, we need to explicitly block
                // it if caller specifically does not want to set the header
                if (request.Headers.TransferEncodingChunked.HasValue && !request.Headers.TransferEncodingChunked.Value)
                {
                    rawHandle = Interop.libcurl.curl_slist_append(rawHandle, NoTransferEncoding);

                    if (rawHandle == null)
                    {
                        throw new HttpRequestException(SR.net_http_client_execution_error);
                    }

                    retVal.SetHandle(rawHandle);
                }

                if (!retVal.IsInvalid)
                {
                    SetCurlOption(handle, CURLoption.CURLOPT_HTTPHEADER, rawHandle);
                }
            }
            finally
            {
                if (gotReference)
                {
                    retVal.DangerousRelease();
                }
            }

            return(retVal);
        }
Exemple #6
0
        private SafeCurlSlistHandle SetRequestHeaders(SafeCurlHandle handle, HttpRequestMessage request)
        {
            SafeCurlSlistHandle retVal = new SafeCurlSlistHandle();

            if (request.Headers == null)
            {
                return(retVal);
            }

            HttpHeaders contentHeaders = null;

            if (request.Content != null)
            {
                SetChunkedModeForSend(request);

                // TODO: Content-Length header isn't getting correctly placed using ToString()
                // This is a bug in HttpContentHeaders that needs to be fixed.
                if (request.Content.Headers.ContentLength.HasValue)
                {
                    long contentLength = request.Content.Headers.ContentLength.Value;
                    request.Content.Headers.ContentLength = null;
                    request.Content.Headers.ContentLength = contentLength;
                }
                contentHeaders = request.Content.Headers;
            }

            string[] allHeaders = HeaderUtilities.DumpHeaders(request.Headers, contentHeaders)
                                  .Split(s_headerDelimiters, StringSplitOptions.RemoveEmptyEntries);
            bool gotReference = false;

            try
            {
                retVal.DangerousAddRef(ref gotReference);
                IntPtr rawHandle = IntPtr.Zero;
                for (int i = 0; i < allHeaders.Length; i++)
                {
                    string header = allHeaders[i].Trim();
                    if (header.Equals("{") || header.Equals("}"))
                    {
                        continue;
                    }
                    rawHandle = Interop.libcurl.curl_slist_append(rawHandle, header);
                    retVal.SetHandle(rawHandle);
                }

                // Since libcurl always adds a Transfer-Encoding header, we need to explicitly block
                // it if caller specifically does not want to set the header
                if (request.Headers.TransferEncodingChunked.HasValue && !request.Headers.TransferEncodingChunked.Value)
                {
                    rawHandle = Interop.libcurl.curl_slist_append(rawHandle, NoTransferEncoding);
                    retVal.SetHandle(rawHandle);
                }

                if (!retVal.IsInvalid)
                {
                    SetCurlOption(handle, CURLoption.CURLOPT_HTTPHEADER, rawHandle);
                }
            }
            finally
            {
                if (gotReference)
                {
                    retVal.DangerousRelease();
                }
            }

            return(retVal);
        }