You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by sc...@apache.org on 2020/04/01 17:56:13 UTC

[xerces-c] branch master updated: XERCESC-1963 - Custom HTTP headers missing with CURL NetAccessor

This is an automated email from the ASF dual-hosted git repository.

scantor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/xerces-c.git


The following commit(s) were added to refs/heads/master by this push:
     new d8881d6  XERCESC-1963 - Custom HTTP headers missing with CURL NetAccessor
d8881d6 is described below

commit d8881d69a3993399179f50f1b76ac3aa8d830774
Author: Scott Cantor <ca...@osu.edu>
AuthorDate: Wed Apr 1 13:55:07 2020 -0400

    XERCESC-1963 - Custom HTTP headers missing with CURL NetAccessor
---
 .../util/NetAccessors/Curl/CurlURLInputStream.cpp  | 58 +++++++++++-----------
 .../util/NetAccessors/Curl/CurlURLInputStream.hpp  | 19 +++----
 2 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
index 8d9befd..5ed6593 100644
--- a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
+++ b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
@@ -56,6 +56,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTPInfo* httpInfo/*=0*/)
       : fMulti(0)
       , fEasy(0)
+      , fHeadersList(0)
       , fMemoryManager(urlSource.getMemoryManager())
       , fURLSource(urlSource)
       , fTotalBytesRead(0)
@@ -69,23 +70,23 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
       , fPayloadLen(0)
       , fContentType(0)
 {
-	// Allocate the curl multi handle
-	fMulti = curl_multi_init();
+    // Allocate the curl multi handle
+    fMulti = curl_multi_init();
 
-	// Allocate the curl easy handle
-	fEasy = curl_easy_init();
+    // Allocate the curl easy handle
+    fEasy = curl_easy_init();
 
-	// Set URL option
+    // Set URL option
     TranscodeToStr url(fURLSource.getURLText(), "ISO8859-1", fMemoryManager);
-	curl_easy_setopt(fEasy, CURLOPT_URL, (char*)url.str());
+    curl_easy_setopt(fEasy, CURLOPT_URL, (char*)url.str());
 
     // Set up a way to recieve the data
-	curl_easy_setopt(fEasy, CURLOPT_WRITEDATA, this);						// Pass this pointer to write function
-	curl_easy_setopt(fEasy, CURLOPT_WRITEFUNCTION, staticWriteCallback);	// Our static write function
+    curl_easy_setopt(fEasy, CURLOPT_WRITEDATA, this);						// Pass this pointer to write function
+    curl_easy_setopt(fEasy, CURLOPT_WRITEFUNCTION, staticWriteCallback);	// Our static write function
 
-	// Do redirects
-	curl_easy_setopt(fEasy, CURLOPT_FOLLOWLOCATION, (long)1);
-	curl_easy_setopt(fEasy, CURLOPT_MAXREDIRS, (long)6);
+    // Do redirects
+    curl_easy_setopt(fEasy, CURLOPT_FOLLOWLOCATION, (long)1);
+    curl_easy_setopt(fEasy, CURLOPT_MAXREDIRS, (long)6);
 
     // Add username and password if authentication is required
     const XMLCh *username = urlSource.getUser();
@@ -117,8 +118,6 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
 
         // Add custom headers
         if(httpInfo->fHeaders) {
-            struct curl_slist *headersList = 0;
-
             const char *headersBuf = httpInfo->fHeaders;
             const char *headersBufEnd = httpInfo->fHeaders + httpInfo->fHeadersLen;
 
@@ -133,7 +132,7 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
                     memcpy(header.get(), headerStart, length);
                     header.get()[length] = 0;
 
-                    headersList = curl_slist_append(headersList, header.get());
+                    fHeadersList = curl_slist_append(fHeadersList, header.get());
 
                     headersBuf += 2;
                     headerStart = headersBuf;
@@ -141,8 +140,7 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
                 }
                 ++headersBuf;
             }
-            curl_easy_setopt(fEasy, CURLOPT_HTTPHEADER, headersList);
-            curl_slist_free_all(headersList);
+            curl_easy_setopt(fEasy, CURLOPT_HTTPHEADER, fHeadersList);
         }
 
         // Set up the payload
@@ -155,16 +153,16 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
         }
     }
 
-	// Add easy handle to the multi stack
-	curl_multi_add_handle(fMulti, fEasy);
+    // Add easy handle to the multi stack
+    curl_multi_add_handle(fMulti, fEasy);
 
     // Start reading, to get the content type
-	while(fBufferHeadPtr == fBuffer)
-	{
-		int runningHandles = 0;
+    while(fBufferHeadPtr == fBuffer)
+    {
+    	int runningHandles = 0;
         readMore(&runningHandles);
-		if(runningHandles == 0) break;
-	}
+    	if(runningHandles == 0) break;
+    }
 
     // Find the content type
     char *contentType8 = 0;
@@ -176,16 +174,18 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const XMLNetHTTP
 
 CurlURLInputStream::~CurlURLInputStream()
 {
-	// Remove the easy handle from the multi stack
-	curl_multi_remove_handle(fMulti, fEasy);
+    // Remove the easy handle from the multi stack
+    curl_multi_remove_handle(fMulti, fEasy);
 
-	// Cleanup the easy handle
-	curl_easy_cleanup(fEasy);
+    // Cleanup the easy handle
+    curl_easy_cleanup(fEasy);
 
-	// Cleanup the multi handle
-	curl_multi_cleanup(fMulti);
+    // Cleanup the multi handle
+    curl_multi_cleanup(fMulti);
 
     if(fContentType) fMemoryManager->deallocate(fContentType);
+
+    if(fHeadersList) curl_slist_free_all(fHeadersList);
 }
 
 
diff --git a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
index ea528c1..f75857b 100644
--- a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
+++ b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
@@ -96,24 +96,25 @@ private :
     //      that readBytes must return.
     // -----------------------------------------------------------------------
 	
-    CURLM*				fMulti;
-    CURL*				fEasy;
-    
+    CURLM*              fMulti;
+    CURL*               fEasy;
+    curl_slist*         fHeadersList;
+
     MemoryManager*      fMemoryManager;
     
-    XMLURL				fURLSource;
+    XMLURL              fURLSource;
     
     XMLSize_t           fTotalBytesRead;
-    XMLByte*			fWritePtr;
+    XMLByte*            fWritePtr;
     XMLSize_t           fBytesRead;
     XMLSize_t           fBytesToRead;
-    bool				fDataAvailable;
+    bool                fDataAvailable;
     
     // Overflow buffer for when curl writes more data to us
     // than we've asked for.
-    XMLByte				fBuffer[CURL_MAX_WRITE_SIZE];
-    XMLByte*			fBufferHeadPtr;
-    XMLByte*			fBufferTailPtr;
+    XMLByte             fBuffer[CURL_MAX_WRITE_SIZE];
+    XMLByte*            fBufferHeadPtr;
+    XMLByte*            fBufferTailPtr;
 
     // Upload data
     const char*         fPayload;


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org