diff OrthancFramework/Sources/HttpClient.cpp @ 4650:9804d6490872

Reduced memory consumption of HTTP/REST plugins calls on POST/PUT if chunked transfer is disabled
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 04 May 2021 10:57:42 +0200
parents 017ab543e6ef
children e8967149d87a
line wrap: on
line diff
--- a/OrthancFramework/Sources/HttpClient.cpp	Fri Apr 30 10:09:50 2021 +0200
+++ b/OrthancFramework/Sources/HttpClient.cpp	Tue May 04 10:57:42 2021 +0200
@@ -622,6 +622,10 @@
     timeout_ = GlobalParameters::GetInstance().GetDefaultTimeout();
     GlobalParameters::GetInstance().GetDefaultProxy(proxy_);
     GlobalParameters::GetInstance().GetSslConfiguration(verifyPeers_, caCertificates_);    
+
+    hasExternalBody_ = false;
+    externalBodyData_ = NULL;
+    externalBodySize_ = 0;
   }
 
 
@@ -718,20 +722,28 @@
   }
 
 
-  void HttpClient::SetBody(const std::string& data)
+  void HttpClient::AssignBody(const std::string& data)
   {
     body_ = data;
     pimpl_->requestBody_.Clear();
+    hasExternalBody_ = false;
   }
 
-  std::string &HttpClient::GetBody()
+
+  void HttpClient::AssignBody(const void* data,
+                              size_t size)
   {
-    return body_;
-  }
-
-  const std::string &HttpClient::GetBody() const
-  {
-    return body_;
+    if (size != 0 &&
+        data == NULL)
+    {
+      throw OrthancException(ErrorCode_NullPointer);
+    }
+    else
+    {
+      body_.assign(reinterpret_cast<const char*>(data), size);
+      pimpl_->requestBody_.Clear();
+      hasExternalBody_ = false;
+    }
   }
 
 
@@ -739,13 +751,34 @@
   {
     body_.clear();
     pimpl_->requestBody_.SetBody(body);
+    hasExternalBody_ = false;
   }
 
   
+  void HttpClient::SetExternalBody(const void* data,
+                                   size_t size)
+  {
+    if (size != 0 &&
+        data == NULL)
+    {
+      throw OrthancException(ErrorCode_NullPointer);
+    }
+    else
+    {
+      body_.clear();
+      pimpl_->requestBody_.Clear();
+      hasExternalBody_ = true;
+      externalBodyData_ = data;
+      externalBodySize_ = size;
+    }
+  }
+  
+
   void HttpClient::ClearBody()
   {
     body_.clear();
     pimpl_->requestBody_.Clear();
+    hasExternalBody_ = false;
   }
 
 
@@ -976,7 +1009,12 @@
           pimpl_->defaultPostHeaders_.Assign(pimpl_->curl_);
         }
 
-        if (body_.size() > 0)
+        if (hasExternalBody_)
+        {
+          CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDS, externalBodyData_));
+          CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDSIZE, externalBodySize_));
+        }
+        else if (body_.size() > 0)
         {
           CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDS, body_.c_str()));
           CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDSIZE, body_.size()));