Conscience Core
CscHttpClient.h
Go to the documentation of this file.
1 #ifndef _CscHttpClient_H
2 #define _CscHttpClient_H
3 
4 #include "CscCommon.h"
5 #include "Util/json.h"
6 #include <mutex>
7 #include <sstream>
8 #include <utility>
9 
10 using std::stringstream, std::exception, std::move;
11 
12 using namespace conscience_utils;
13 using namespace conscience_utils::JSON;
14 using namespace conscience_utils::logging;
15 
16 namespace fs = std::filesystem;
17 
19 
21  static optional<unsigned> &defaultTimeoutSecondsGet();
22  static optional<unsigned> &defaultTimeoutSecondsPost();
23  static optional<unsigned> &defaultTimeoutSecondsDownload();
24 };
25 
30 public:
31  HttpErrorResponseException(const string &errorMessage, optional<unsigned> httpCode) noexcept;
32  ~HttpErrorResponseException() noexcept override = default;
33  optional<unsigned> getHttpCode() const;
34 private:
35  const optional<unsigned> httpCode;
36 };
37 
39 public:
40  HttpErrorTimeoutException(const string &errorMessage) noexcept : CscException(errorMessage) {}
41  ~HttpErrorTimeoutException() noexcept override = default;
42 };
43 
44  class HttpResponse {
45  public:
46  HttpResponse(const long code,
47  const string &content,
48  const map<string, string> &headers);
49 
50  const string &getContent() const;
51  ptr<CscJsonObjectReader> getContentAsJson() const;
52 
56  template <class T>
57  vector<T> getContentAsJsonArray() const {
58  return getContentAsJson()->asArrayValue<T>();
59  }
60 
61  const long &getCode() const;
62  const map<string, string> &getHeaders();
63 
67  optional<string> getHeader(const string &headerName) const;
68 
69  private:
70  const long code;
71  const string content;
72  const map<string, string> headers;
73  };
74 
75  struct HttpGet {
76  public:
77  string protocol;
78  string host;
79  string path;
84  map<string, string> queryStringParameters = {};
85  optional<int> port = {};
86  map<string, string> headers = {};
87  optional<unsigned> timeoutSeconds = CscHttpClientConfiguration::defaultTimeoutSecondsGet();
88 
89  int getPort() const {
90  return port.value_or(protocol == "https" ? 443 : 80);
91  }
92  };
93 
94  typedef variant<map<string, string>, string, const char *, ptr<CscJsonObject>> PostParameters;
95 
96  struct HttpPost {
97  public:
98  string protocol;
99  string host;
100  string path;
106  map<string, string> queryStringParameters = {};
107  map<string, string> headers = {};
108  optional<int> port = {};
109  optional<unsigned> timeoutSeconds = CscHttpClientConfiguration::defaultTimeoutSecondsPost();
110  std::optional<std::string> rawBinaryBody;
111 
112  int getPort() const {
113  return port.value_or(protocol == "https" ? 443 : 80);
114  }
115  };
116 
118  std::string protocol;
119  std::string host;
120  std::string path;
121  std::map<std::string, std::string> fields; // Ex. {{"key", "value"}}
122  std::string fileFieldName; // Ex. "file"
123  std::string fileName; // Ex. "image.jpg"
124  std::string mimeType; // Ex. "image/jpeg"
125  std::vector<uint8_t> fileContent; // Données de l'image en mémoire
126  std::map<std::string, std::string> headers;
127  int port = 80;
128  int timeoutSeconds = 30;
129  };
130 
131  inline PostParameters postBody(const map<string, string> &fromMap) {
132  return fromMap;
133  }
134 
136  public:
137  static CscHttpClient &Instance();
138 
139  ptr<HttpResponse> get(const HttpGet &parameters) const noexcept(false);
140  ptr<HttpResponse> postMultipart(const HttpMultipartPost &parameters) const;
141 
145  ptr<HttpResponse> download(
146  const HttpGet &parameters, const fs::path &outFilePath, optional<function<void(float progressRatio)>> onProgress = {}, optional<unsigned> timeoutSeconds = CscHttpClientConfiguration::defaultTimeoutSecondsDownload()) const noexcept(false);
147 
148  ptr<HttpResponse> upload(
149  const string &protocol, const string &host, const string &path, int port, const fs::path &filePath) const noexcept(false);
150 
151  ptr<HttpResponse> upload(
152  const string &protocol,
153  const string &host,
154  const string &path,
155  int port,
156  const std::vector<unsigned char> &dataBuffer,
157  const std::string &contentType = "application/octet-stream") const;
158 
159  ptr<HttpResponse> post(const HttpPost &parameters) const noexcept(false);
160 
161  private:
162  std::string generateBoundary() const;
163  struct InternalRequestOptions {
164  public:
165  bool post = false;
166  optional<fs::path> uploadedFilePath = {};
167  map<string, string> headers;
168  map<string, string> queryStringParameters;
169  optional<PostParameters> postParameters = {};
170  optional<fs::path> downloadedFilePath = {};
171  optional<unsigned> timeoutSeconds = {};
172  optional<function<void(float progressRatio)>> onProgress = {};
173  std::optional<std::string> rawBody;
177  InternalRequestOptions &setPost(bool post);
178  InternalRequestOptions &setUploadedFilePath(const fs::path &uploadedFilePath);
179  InternalRequestOptions &setDownloadedFilePath(const fs::path &downloadedFilePath);
180  InternalRequestOptions &setHeaders(const map<string, string> &headers);
181  InternalRequestOptions &setQueryStringParameters(const map<string, string> &parameters);
182  InternalRequestOptions &setRawBody(const std::string &body);
183 
187  InternalRequestOptions &setPostParameters(PostParameters parameters);
188  InternalRequestOptions &setTimeoutSeconds(const optional<unsigned> &timeoutSeconds);
189  optional<string> getHeader(const string &name) const;
190  InternalRequestOptions &setProgressCallback(const optional<function<void(float progressRatio)>> &onProgress);
191  };
192 
193  InternalRequestOptions options() const;
194 
195  inline static std::mutex singletonMutex;
196  inline static CscHttpClient *instance = nullptr;
197 
198  std::unique_ptr<CscLogger> logger;
199 
200  CscHttpClient();
201 
202  virtual ~CscHttpClient() = default;
203 
204  ptr<HttpResponse> performRequest(
205  const string &protocol, const string &host, const string &path, int port, const InternalRequestOptions &options) const;
206 
207  void logRequest(string summary, const string &protocol, const string &host, const string &path, int port) const;
208  };
209 
210 }
211 
212 #endif
conscience_core::communication::HTTP::HttpPost::getPort
int getPort() const
Definition: CscHttpClient.h:112
conscience_core::communication::HTTP::CscHttpClient
Definition: CscHttpClient.h:135
conscience_core::communication::HTTP::HttpPost::body
PostParameters body
Definition: CscHttpClient.h:101
conscience_core::communication::HTTP::HttpMultipartPost::fields
std::map< std::string, std::string > fields
Definition: CscHttpClient.h:121
conscience_core::ai::fromMap
MrptGrid fromMap(const COccupancyGridMap2D &m)
Definition: CscMrptAutonomousExploration.cpp:107
conscience_core::communication::HTTP::HttpGet::host
string host
Definition: CscHttpClient.h:78
conscience_core::communication::HTTP::HttpGet::path
string path
Definition: CscHttpClient.h:79
conscience_core::communication::HTTP::HttpErrorTimeoutException::HttpErrorTimeoutException
HttpErrorTimeoutException(const string &errorMessage) noexcept
Definition: CscHttpClient.h:40
conscience_core::communication::HTTP::HttpMultipartPost::fileFieldName
std::string fileFieldName
Definition: CscHttpClient.h:122
conscience_core::communication::HTTP::HttpMultipartPost::path
std::string path
Definition: CscHttpClient.h:120
conscience_core::communication::HTTP::HttpErrorTimeoutException
Definition: CscHttpClient.h:38
conscience_core::communication::HTTP::HttpPost::protocol
string protocol
Definition: CscHttpClient.h:98
conscience_core::communication::HTTP::HttpPost
Definition: CscHttpClient.h:96
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
conscience_core::communication::HTTP
Definition: CscHttpClient.cpp:13
conscience_utils::logging
Definition: conscience_log.cpp:20
conscience_core::communication::HTTP::HttpResponse::getContentAsJsonArray
vector< T > getContentAsJsonArray() const
Definition: CscHttpClient.h:57
conscience_core::communication::HTTP::HttpGet::protocol
string protocol
Definition: CscHttpClient.h:77
conscience_utils::JSON
Definition: CscCommandMetadataBuilder.h:20
conscience_core::communication::HTTP::CscHttpClientConfiguration
Definition: CscHttpClient.h:20
conscience_core::communication::HTTP::HttpMultipartPost::headers
std::map< std::string, std::string > headers
Definition: CscHttpClient.h:126
conscience_core::communication::HTTP::PostParameters
variant< map< string, string >, string, const char *, ptr< CscJsonObject > > PostParameters
Definition: CscHttpClient.h:94
conscience_core::communication::HTTP::HttpPost::rawBinaryBody
std::optional< std::string > rawBinaryBody
Definition: CscHttpClient.h:110
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
conscience_core::communication::HTTP::HttpPost::host
string host
Definition: CscHttpClient.h:99
conscience_core::communication::HTTP::HttpMultipartPost::fileName
std::string fileName
Definition: CscHttpClient.h:123
CscCommon.h
conscience_core::communication::HTTP::HttpMultipartPost
Definition: CscHttpClient.h:117
conscience_core::communication::HTTP::postBody
PostParameters postBody(const map< string, string > &fromMap)
Definition: CscHttpClient.h:131
conscience_server::entities::instance
ServerEntities * instance
Definition: ServerEntities.cpp:39
conscience_utils
Definition: CscEntityReflexion.h:50
conscience_core::communication::HTTP::HttpGet::getPort
int getPort() const
Definition: CscHttpClient.h:89
conscience_core::communication::HTTP::HttpPost::path
string path
Definition: CscHttpClient.h:100
conscience_core::communication::HTTP::HttpErrorResponseException
Definition: CscHttpClient.h:29
nlohmann::detail::get
auto get(const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
Definition: json.hpp:4579
onProgress
optional< function< void(float progressRatio)> > onProgress
Definition: CscHttpClient.cpp:77
conscience_core::communication::HTTP::HttpMultipartPost::protocol
std::string protocol
Definition: CscHttpClient.h:118
json.h
conscience_core::communication::HTTP::HttpMultipartPost::fileContent
std::vector< uint8_t > fileContent
Definition: CscHttpClient.h:125
conscience_core::communication::HTTP::HttpMultipartPost::host
std::string host
Definition: CscHttpClient.h:119
conscience_core::bridging::commands::environment_objects::optional< string >
const ptr< CscObjectModel > const string const CscPoint3d const CscPoint3d optional< string >
Definition: environmentObjectsCommands.h:373
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29
conscience_core::communication::HTTP::HttpResponse
Definition: CscHttpClient.h:44
conscience_core::communication::HTTP::HttpGet
Definition: CscHttpClient.h:75
conscience_utils::CscException
Definition: conscience_util.h:698
conscience_core::communication::HTTP::HttpMultipartPost::mimeType
std::string mimeType
Definition: CscHttpClient.h:124