olp-cpp-sdk 1.24.0
Loading...
Searching...
No Matches
HttpResponse.h
1/*
2 * Copyright (C) 2019-2024 HERE Europe B.V.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * SPDX-License-Identifier: Apache-2.0
17 * License-Filename: LICENSE
18 */
19
20#pragma once
21
22#include <sstream>
23#include <string>
24#include <utility>
25#include <vector>
26
27#include <olp/core/CoreApi.h>
28#include <olp/core/http/NetworkTypes.h>
29
30namespace olp {
31namespace client {
32
38 public:
39 NetworkStatistics() = default;
40
49 NetworkStatistics(uint64_t bytes_uploaded, uint64_t bytes_downloaded)
50 : bytes_uploaded_{bytes_uploaded}, bytes_downloaded_{bytes_downloaded} {}
51
57 uint64_t GetBytesUploaded() const { return bytes_uploaded_; }
58
64 uint64_t GetBytesDownloaded() const { return bytes_downloaded_; }
65
68 bytes_uploaded_ += other.bytes_uploaded_;
69 bytes_downloaded_ += other.bytes_downloaded_;
70 return *this;
71 }
72
75 NetworkStatistics statistics(*this);
76 statistics += other;
77 return statistics;
78 }
79
80 private:
81 uint64_t bytes_uploaded_{0};
82 uint64_t bytes_downloaded_{0};
83};
84
89class CORE_API HttpResponse {
90 public:
91 HttpResponse() = default;
92 virtual ~HttpResponse() = default;
93
100 HttpResponse(int status, std::string response = {}) // NOLINT
101 : status_(status), response_(std::move(response)) {}
102
110 HttpResponse(int status, std::stringstream&& response)
111 : status_(status), response_(std::move(response)) {}
112
121 HttpResponse(int status, std::stringstream&& response, http::Headers headers)
122 : status_(status),
123 response_(std::move(response)),
124 headers_(std::move(headers)) {}
125
135 : status_(other.status_),
136 headers_(other.headers_),
137 network_statistics_(other.network_statistics_) {
138 response_ << other.response_.rdbuf();
139 if (!response_.good()) {
140 // Depending on the users handling of the stringstream it might be that
141 // the read position is already at the end and thus operator<< cannot
142 // read anything, so lets try with the safer but more memory intensive
143 // solution as a second step.
144 response_.str(other.GetResponseAsString());
145 }
146 }
147
157 if (this != &other) {
158 status_ = other.status_;
159 response_ = std::stringstream{};
160 response_ << other.response_.rdbuf();
161 headers_ = other.headers_;
162 network_statistics_ = other.network_statistics_;
163 }
164
165 return *this;
166 }
167
170
173
179 void GetResponse(std::vector<unsigned char>& output) {
180 response_.seekg(0, std::ios::end);
181 const auto pos = response_.tellg();
182 if (pos > 0) {
183 output.resize(pos);
184 }
185 response_.seekg(0, std::ios::beg);
186 response_.read(reinterpret_cast<char*>(output.data()), output.size());
187 response_.seekg(0, std::ios::beg);
188 }
189
195 void GetResponse(std::string& output) const { output = response_.str(); }
196
202 std::vector<unsigned char> GetResponseAsBytes() {
203 std::vector<unsigned char> bytes;
204 GetResponse(bytes);
205 return bytes;
206 }
207
213 std::string GetResponseAsString() const {
214 std::string result;
215 GetResponse(result);
216 return result;
217 }
218
224 std::stringstream& GetRawResponse() { return response_; }
225
231 const http::Headers& GetHeaders() const { return headers_; }
232
241 int GetStatus() const { return status_; }
242
248 void SetNetworkStatistics(NetworkStatistics network_statistics) {
249 network_statistics_ = network_statistics;
250 }
251
258 return network_statistics_;
259 }
260
261 private:
262 int status_{static_cast<int>(olp::http::ErrorCode::UNKNOWN_ERROR)};
263 std::stringstream response_;
264 http::Headers headers_;
265 NetworkStatistics network_statistics_;
266};
267
268} // namespace client
269} // namespace olp
This class represents the HTTP response created from the NetworkResponse and the request body.
Definition HttpResponse.h:89
HttpResponse(int status, std::stringstream &&response, http::Headers headers)
Creates the HttpResponse instance.
Definition HttpResponse.h:121
HttpResponse & operator=(HttpResponse &&)=default
A default move assignment operator.
HttpResponse(int status, std::string response={})
Creates the HttpResponse instance.
Definition HttpResponse.h:100
const http::Headers & GetHeaders() const
Return the const reference to the response headers.
Definition HttpResponse.h:231
std::stringstream & GetRawResponse()
Return the reference to the response object.
Definition HttpResponse.h:224
HttpResponse(int status, std::stringstream &&response)
Creates the HttpResponse instance.
Definition HttpResponse.h:110
std::vector< unsigned char > GetResponseAsBytes()
Get the response body as a vector of unsigned chars.
Definition HttpResponse.h:202
HttpResponse(const HttpResponse &other)
A copy constructor.
Definition HttpResponse.h:134
int GetStatus() const
Return the response status.
Definition HttpResponse.h:241
void GetResponse(std::string &output) const
Copy HttpResponse content to a string.
Definition HttpResponse.h:195
std::string GetResponseAsString() const
Renders HttpResponse content to a string.
Definition HttpResponse.h:213
void GetResponse(std::vector< unsigned char > &output)
Copy HttpResponse content to a vector of unsigned chars.
Definition HttpResponse.h:179
const NetworkStatistics & GetNetworkStatistics() const
Get the NetworkStatistics.
Definition HttpResponse.h:257
HttpResponse & operator=(const HttpResponse &other)
A copy assignment operator.
Definition HttpResponse.h:156
void SetNetworkStatistics(NetworkStatistics network_statistics)
Set NetworkStatistics.
Definition HttpResponse.h:248
HttpResponse(HttpResponse &&)=default
A default move constructor.
Network statistics with information on the outbound and inbound trafic during API calls.
Definition HttpResponse.h:37
NetworkStatistics & operator+=(const NetworkStatistics &other)
An overloaded addition operator for accumulating statistics.
Definition HttpResponse.h:67
NetworkStatistics(uint64_t bytes_uploaded, uint64_t bytes_downloaded)
Creates the NetworkStatistics instance.
Definition HttpResponse.h:49
NetworkStatistics operator+(const NetworkStatistics &other) const
An overloaded addition operator for accumulating statistics.
Definition HttpResponse.h:74
uint64_t GetBytesUploaded() const
Get the number of bytes of outbound traffic.
Definition HttpResponse.h:57
uint64_t GetBytesDownloaded() const
Get the number of bytes of inbound traffic.
Definition HttpResponse.h:64
@ UNKNOWN_ERROR
Internal error that can't be interpreted.
std::vector< Header > Headers
An alias for a vector of the HTTP headers.
Definition NetworkTypes.h:140
Rules all the other namespaces.
Definition AppleSignInProperties.h:24