comparison 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
comparison
equal deleted inserted replaced
4649:e915102093de 4650:9804d6490872
620 lastStatus_ = HttpStatus_None; 620 lastStatus_ = HttpStatus_None;
621 SetVerbose(GlobalParameters::GetInstance().IsDefaultVerbose()); 621 SetVerbose(GlobalParameters::GetInstance().IsDefaultVerbose());
622 timeout_ = GlobalParameters::GetInstance().GetDefaultTimeout(); 622 timeout_ = GlobalParameters::GetInstance().GetDefaultTimeout();
623 GlobalParameters::GetInstance().GetDefaultProxy(proxy_); 623 GlobalParameters::GetInstance().GetDefaultProxy(proxy_);
624 GlobalParameters::GetInstance().GetSslConfiguration(verifyPeers_, caCertificates_); 624 GlobalParameters::GetInstance().GetSslConfiguration(verifyPeers_, caCertificates_);
625
626 hasExternalBody_ = false;
627 externalBodyData_ = NULL;
628 externalBodySize_ = 0;
625 } 629 }
626 630
627 631
628 HttpClient::HttpClient() : 632 HttpClient::HttpClient() :
629 pimpl_(new PImpl), 633 pimpl_(new PImpl),
716 { 720 {
717 return timeout_; 721 return timeout_;
718 } 722 }
719 723
720 724
721 void HttpClient::SetBody(const std::string& data) 725 void HttpClient::AssignBody(const std::string& data)
722 { 726 {
723 body_ = data; 727 body_ = data;
724 pimpl_->requestBody_.Clear(); 728 pimpl_->requestBody_.Clear();
725 } 729 hasExternalBody_ = false;
726 730 }
727 std::string &HttpClient::GetBody() 731
728 { 732
729 return body_; 733 void HttpClient::AssignBody(const void* data,
730 } 734 size_t size)
731 735 {
732 const std::string &HttpClient::GetBody() const 736 if (size != 0 &&
733 { 737 data == NULL)
734 return body_; 738 {
739 throw OrthancException(ErrorCode_NullPointer);
740 }
741 else
742 {
743 body_.assign(reinterpret_cast<const char*>(data), size);
744 pimpl_->requestBody_.Clear();
745 hasExternalBody_ = false;
746 }
735 } 747 }
736 748
737 749
738 void HttpClient::SetBody(IRequestBody& body) 750 void HttpClient::SetBody(IRequestBody& body)
739 { 751 {
740 body_.clear(); 752 body_.clear();
741 pimpl_->requestBody_.SetBody(body); 753 pimpl_->requestBody_.SetBody(body);
754 hasExternalBody_ = false;
742 } 755 }
743 756
744 757
758 void HttpClient::SetExternalBody(const void* data,
759 size_t size)
760 {
761 if (size != 0 &&
762 data == NULL)
763 {
764 throw OrthancException(ErrorCode_NullPointer);
765 }
766 else
767 {
768 body_.clear();
769 pimpl_->requestBody_.Clear();
770 hasExternalBody_ = true;
771 externalBodyData_ = data;
772 externalBodySize_ = size;
773 }
774 }
775
776
745 void HttpClient::ClearBody() 777 void HttpClient::ClearBody()
746 { 778 {
747 body_.clear(); 779 body_.clear();
748 pimpl_->requestBody_.Clear(); 780 pimpl_->requestBody_.Clear();
781 hasExternalBody_ = false;
749 } 782 }
750 783
751 784
752 void HttpClient::SetVerbose(bool isVerbose) 785 void HttpClient::SetVerbose(bool isVerbose)
753 { 786 {
974 if (pimpl_->userHeaders_.IsEmpty()) 1007 if (pimpl_->userHeaders_.IsEmpty())
975 { 1008 {
976 pimpl_->defaultPostHeaders_.Assign(pimpl_->curl_); 1009 pimpl_->defaultPostHeaders_.Assign(pimpl_->curl_);
977 } 1010 }
978 1011
979 if (body_.size() > 0) 1012 if (hasExternalBody_)
1013 {
1014 CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDS, externalBodyData_));
1015 CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDSIZE, externalBodySize_));
1016 }
1017 else if (body_.size() > 0)
980 { 1018 {
981 CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDS, body_.c_str())); 1019 CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDS, body_.c_str()));
982 CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDSIZE, body_.size())); 1020 CheckCode(curl_easy_setopt(pimpl_->curl_, CURLOPT_POSTFIELDSIZE, body_.size()));
983 } 1021 }
984 else 1022 else