From 2da9ea727c597316c589c89b61afb0152ba60b69 Mon Sep 17 00:00:00 2001 From: Taiju Yamada Date: Thu, 25 Jul 2019 12:27:13 +0900 Subject: [PATCH 1/4] tried to print error in savebackup --- src/controllerclientimpl.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/controllerclientimpl.cpp b/src/controllerclientimpl.cpp index 02c8790e..2b67f17c 100644 --- a/src/controllerclientimpl.cpp +++ b/src/controllerclientimpl.cpp @@ -612,15 +612,30 @@ int ControllerClientImpl::_CallGet(const std::string& desturi, std::ostream& out CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_TIMEOUT_MS, 0L, (long)(timeout * 1000L)); CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_HTTPHEADER, NULL, _httpheadersjson); CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_URL, NULL, desturi.c_str()); - CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, _WriteOStreamCallback); - CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEDATA, NULL, &outputStream); + _buffer.clear(); + _buffer.str(""); + CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, static_cast([](char *data, size_t size, size_t nmemb, void **writerData) -> size_t{ + if(((std::stringstream*)writerData[0])->tellg() < 0x1000) { + _WriteStringStreamCallback(data, size, nmemb, (std::stringstream*)writerData[0]); + } + return _WriteOStreamCallback(data, size, nmemb, (std::ostream*)writerData[1]); + })); + void *writerData[]{&_buffer,&outputStream}; + CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEDATA, NULL, writerData); CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_HTTPGET, 0L, 1L); CURL_PERFORM(_curl); long http_code = 0; CURL_INFO_GETTER(_curl, CURLINFO_RESPONSE_CODE, &http_code); + std::string outputdata = _buffer.str(); if( expectedhttpcode != 0 && http_code != expectedhttpcode ) { - // outputStream is not always seekable; ignore any error message. - throw MUJIN_EXCEPTION_FORMAT("HTTP GET to '%s' returned HTTP status %s (outputStream might have information)", desturi%http_code, MEC_HTTPServer); + if( outputdata.size() > 0 ) { + rapidjson::Document d; + ParseJson(d, _buffer.str()); + std::string error_message = GetJsonValueByKey(d, "error_message"); + std::string traceback = GetJsonValueByKey(d, "traceback"); + throw MUJIN_EXCEPTION_FORMAT("HTTP GET to '%s' returned HTTP status %s: %s", desturi%http_code%error_message, MEC_HTTPServer); + } + throw MUJIN_EXCEPTION_FORMAT("HTTP GET to '%s' returned HTTP status %s", desturi%http_code, MEC_HTTPServer); } return http_code; } From 73bfd29ecb27a00d0cb5282fcc21dc750a5ff37b Mon Sep 17 00:00:00 2001 From: Taiju Yamada Date: Mon, 2 Sep 2019 17:53:07 +0900 Subject: [PATCH 2/4] fixed Windows compilcation --- src/controllerclientimpl.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/controllerclientimpl.cpp b/src/controllerclientimpl.cpp index 409843f3..16636923 100644 --- a/src/controllerclientimpl.cpp +++ b/src/controllerclientimpl.cpp @@ -609,12 +609,15 @@ int ControllerClientImpl::_CallGet(const std::string& desturi, std::ostream& out CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_URL, NULL, desturi.c_str()); _buffer.clear(); _buffer.str(""); - CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, static_cast([](char *data, size_t size, size_t nmemb, void **writerData) -> size_t{ - if(((std::stringstream*)writerData[0])->tellg() < 0x1000) { - _WriteStringStreamCallback(data, size, nmemb, (std::stringstream*)writerData[0]); + struct scallback{ + static size_t callback(char *data, size_t size, size_t nmemb, void **writerData){ + if(((std::stringstream*)writerData[0])->tellg() < 0x1000) { + _WriteStringStreamCallback(data, size, nmemb, (std::stringstream*)writerData[0]); + } + return _WriteOStreamCallback(data, size, nmemb, (std::ostream*)writerData[1]); } - return _WriteOStreamCallback(data, size, nmemb, (std::ostream*)writerData[1]); - })); + }; + CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, scallback::callback); void *writerData[]{&_buffer,&outputStream}; CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEDATA, NULL, writerData); CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_HTTPGET, 0L, 1L); From 6ce39e7f12b66185ddcc74a14ff181d7082b4f26 Mon Sep 17 00:00:00 2001 From: Taiju Yamada Date: Mon, 2 Sep 2019 17:57:10 +0900 Subject: [PATCH 3/4] refix --- src/controllerclientimpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllerclientimpl.cpp b/src/controllerclientimpl.cpp index 16636923..70e032d3 100644 --- a/src/controllerclientimpl.cpp +++ b/src/controllerclientimpl.cpp @@ -618,7 +618,7 @@ int ControllerClientImpl::_CallGet(const std::string& desturi, std::ostream& out } }; CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, scallback::callback); - void *writerData[]{&_buffer,&outputStream}; + void *writerData[]={&_buffer,&outputStream}; CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEDATA, NULL, writerData); CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_HTTPGET, 0L, 1L); CURL_PERFORM(_curl); From 2a1b382407662e3eaefc92475891556c073ce359 Mon Sep 17 00:00:00 2001 From: Taiju Yamada Date: Fri, 6 Sep 2019 18:33:30 +0900 Subject: [PATCH 4/4] moved _CallGet ostream callback outside of function --- src/controllerclientimpl.cpp | 18 +++++++++--------- src/controllerclientimpl.h | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/controllerclientimpl.cpp b/src/controllerclientimpl.cpp index 70e032d3..19b22351 100644 --- a/src/controllerclientimpl.cpp +++ b/src/controllerclientimpl.cpp @@ -601,6 +601,14 @@ int ControllerClientImpl::_CallGet(const std::string& desturi, std::string& outp return http_code; } +int ControllerClientImpl::_DuplicateStreamCallback(char *data, size_t size, size_t nmemb, void **writerDataStringStreamAndOStream) +{ + if(((std::stringstream*)writerDataStringStreamAndOStream[0])->tellp() < 0x1000) { + ControllerClientImpl::_WriteStringStreamCallback(data, size, nmemb, (std::stringstream*)writerDataStringStreamAndOStream[0]); + } + return ControllerClientImpl::_WriteOStreamCallback(data, size, nmemb, (std::ostream*)writerDataStringStreamAndOStream[1]); +} + int ControllerClientImpl::_CallGet(const std::string& desturi, std::ostream& outputStream, int expectedhttpcode, double timeout) { MUJIN_LOG_VERBOSE(str(boost::format("GET %s")%desturi)); @@ -609,15 +617,7 @@ int ControllerClientImpl::_CallGet(const std::string& desturi, std::ostream& out CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_URL, NULL, desturi.c_str()); _buffer.clear(); _buffer.str(""); - struct scallback{ - static size_t callback(char *data, size_t size, size_t nmemb, void **writerData){ - if(((std::stringstream*)writerData[0])->tellg() < 0x1000) { - _WriteStringStreamCallback(data, size, nmemb, (std::stringstream*)writerData[0]); - } - return _WriteOStreamCallback(data, size, nmemb, (std::ostream*)writerData[1]); - } - }; - CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, scallback::callback); + CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEFUNCTION, NULL, _DuplicateStreamCallback); void *writerData[]={&_buffer,&outputStream}; CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_WRITEDATA, NULL, writerData); CURL_OPTION_SAVE_SETTER(_curl, CURLOPT_HTTPGET, 0L, 1L); diff --git a/src/controllerclientimpl.h b/src/controllerclientimpl.h index 40f6ec16..7df0da3c 100644 --- a/src/controllerclientimpl.h +++ b/src/controllerclientimpl.h @@ -176,6 +176,7 @@ class ControllerClientImpl : public ControllerClient, public boost::enable_share static int _WriteVectorCallback(char *data, size_t size, size_t nmemb, std::vector *writerData); static int _WriteOStreamCallback(char *data, size_t size, size_t nmemb, std::ostream *writerData); static int _ReadIStreamCallback(char *data, size_t size, size_t nmemb, std::istream *writerData); + static int _DuplicateStreamCallback(char *data, size_t size, size_t nmemb, void **writerDataStringStreamAndOStream); /// \brief sets up http header for doing http operation with json data void _SetupHTTPHeadersJSON();