2323#include < nlohmann/json.hpp>
2424
2525#include " iceberg/catalog/rest/constant.h"
26+ #include " iceberg/catalog/rest/error_handlers.h"
2627#include " iceberg/catalog/rest/json_internal.h"
2728#include " iceberg/json_internal.h"
29+ #include " iceberg/result.h"
2830#include " iceberg/util/macros.h"
2931
3032namespace iceberg ::rest {
@@ -47,11 +49,8 @@ class HttpResponse::Impl {
4749};
4850
4951HttpResponse::HttpResponse (HttpResponse&&) noexcept = default ;
50-
5152HttpResponse& HttpResponse::operator =(HttpResponse&&) noexcept = default ;
52-
5353HttpResponse::HttpResponse () = default ;
54-
5554HttpResponse::~HttpResponse () = default ;
5655
5756int32_t HttpResponse::status_code () const { return impl_->status_code (); }
@@ -101,6 +100,7 @@ bool IsSuccessful(int32_t status_code) {
101100Status HandleFailureResponse (const cpr::Response& response,
102101 const ErrorHandler& error_handler) {
103102 if (!IsSuccessful (response.status_code )) {
103+ // TODO(gangwu): response status code is lost, wrap it with RestError.
104104 ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.text ));
105105 ICEBERG_ASSIGN_OR_RAISE (auto error_response, ErrorResponseFromJson (json));
106106 return error_handler.Accept (error_response.error );
@@ -137,30 +137,34 @@ Result<HttpResponse> HttpClient::Get(
137137 const std::string& path, const std::unordered_map<std::string, std::string>& params,
138138 const std::unordered_map<std::string, std::string>& headers,
139139 const ErrorHandler& error_handler) {
140- std::scoped_lock<std::mutex> lock (session_mutex_);
140+ cpr::Response response;
141+ {
142+ std::scoped_lock<std::mutex> lock (session_mutex_);
143+ PrepareSession (path, headers, params);
144+ response = session_->Get ();
145+ }
141146
142- PrepareSession (path, headers, params);
143- cpr::Response response = session_->Get ();
144147 ICEBERG_RETURN_UNEXPECTED (HandleFailureResponse (response, error_handler));
145- auto impl = std::make_unique<HttpResponse::Impl>(std::move (response));
146148 HttpResponse http_response;
147- http_response.impl_ = std::move (impl );
149+ http_response.impl_ = std::make_unique<HttpResponse::Impl>( std:: move (response) );
148150 return http_response;
149151}
150152
151153Result<HttpResponse> HttpClient::Post (
152154 const std::string& path, const std::string& body,
153155 const std::unordered_map<std::string, std::string>& headers,
154156 const ErrorHandler& error_handler) {
155- std::scoped_lock<std::mutex> lock (session_mutex_);
157+ cpr::Response response;
158+ {
159+ std::scoped_lock<std::mutex> lock (session_mutex_);
160+ PrepareSession (path, headers);
161+ session_->SetBody (cpr::Body{body});
162+ response = session_->Post ();
163+ }
156164
157- PrepareSession (path, headers);
158- session_->SetBody (cpr::Body{body});
159- cpr::Response response = session_->Post ();
160165 ICEBERG_RETURN_UNEXPECTED (HandleFailureResponse (response, error_handler));
161- auto impl = std::make_unique<HttpResponse::Impl>(std::move (response));
162166 HttpResponse http_response;
163- http_response.impl_ = std::move (impl );
167+ http_response.impl_ = std::make_unique<HttpResponse::Impl>( std:: move (response) );
164168 return http_response;
165169}
166170
@@ -169,52 +173,61 @@ Result<HttpResponse> HttpClient::PostForm(
169173 const std::unordered_map<std::string, std::string>& form_data,
170174 const std::unordered_map<std::string, std::string>& headers,
171175 const ErrorHandler& error_handler) {
172- std::scoped_lock<std::mutex> lock (session_mutex_) ;
176+ cpr::Response response ;
173177
174- // Override default Content-Type (application/json) with form-urlencoded
175- auto form_headers = headers;
176- form_headers[kHeaderContentType ] = kMimeTypeFormUrlEncoded ;
178+ {
179+ std::scoped_lock<std::mutex> lock (session_mutex_);
177180
178- PrepareSession (path, form_headers);
179- std::vector<cpr::Pair> pair_list;
180- pair_list.reserve (form_data.size ());
181- for (const auto & [key, val] : form_data) {
182- pair_list.emplace_back (key, val);
181+ // Override default Content-Type (application/json) with form-urlencoded
182+ auto form_headers = headers;
183+ form_headers[kHeaderContentType ] = kMimeTypeFormUrlEncoded ;
184+
185+ PrepareSession (path, form_headers);
186+ std::vector<cpr::Pair> pair_list;
187+ pair_list.reserve (form_data.size ());
188+ for (const auto & [key, val] : form_data) {
189+ pair_list.emplace_back (key, val);
190+ }
191+ session_->SetPayload (cpr::Payload (pair_list.begin (), pair_list.end ()));
192+
193+ response = session_->Post ();
183194 }
184- session_->SetPayload (cpr::Payload (pair_list.begin (), pair_list.end ()));
185- cpr::Response response = session_->Post ();
195+
186196 ICEBERG_RETURN_UNEXPECTED (HandleFailureResponse (response, error_handler));
187- auto impl = std::make_unique<HttpResponse::Impl>(std::move (response));
188197 HttpResponse http_response;
189- http_response.impl_ = std::move (impl );
198+ http_response.impl_ = std::make_unique<HttpResponse::Impl>( std:: move (response) );
190199 return http_response;
191200}
192201
193202Result<HttpResponse> HttpClient::Head (
194203 const std::string& path, const std::unordered_map<std::string, std::string>& headers,
195204 const ErrorHandler& error_handler) {
196- std::scoped_lock<std::mutex> lock (session_mutex_);
205+ cpr::Response response;
206+ {
207+ std::scoped_lock<std::mutex> lock (session_mutex_);
208+ PrepareSession (path, headers);
209+ response = session_->Head ();
210+ }
197211
198- PrepareSession (path, headers);
199- cpr::Response response = session_->Head ();
200212 ICEBERG_RETURN_UNEXPECTED (HandleFailureResponse (response, error_handler));
201- auto impl = std::make_unique<HttpResponse::Impl>(std::move (response));
202213 HttpResponse http_response;
203- http_response.impl_ = std::move (impl );
214+ http_response.impl_ = std::make_unique<HttpResponse::Impl>( std:: move (response) );
204215 return http_response;
205216}
206217
207218Result<HttpResponse> HttpClient::Delete (
208219 const std::string& path, const std::unordered_map<std::string, std::string>& headers,
209220 const ErrorHandler& error_handler) {
210- std::scoped_lock<std::mutex> lock (session_mutex_);
221+ cpr::Response response;
222+ {
223+ std::scoped_lock<std::mutex> lock (session_mutex_);
224+ PrepareSession (path, headers);
225+ response = session_->Delete ();
226+ }
211227
212- PrepareSession (path, headers);
213- cpr::Response response = session_->Delete ();
214228 ICEBERG_RETURN_UNEXPECTED (HandleFailureResponse (response, error_handler));
215- auto impl = std::make_unique<HttpResponse::Impl>(std::move (response));
216229 HttpResponse http_response;
217- http_response.impl_ = std::move (impl );
230+ http_response.impl_ = std::make_unique<HttpResponse::Impl>( std:: move (response) );
218231 return http_response;
219232}
220233
0 commit comments