Remove manually check error and throw because boost asio with use_awaitable throws exceptions
This commit is contained in:
parent
f2f6f253ec
commit
a78a72d41d
3 changed files with 9 additions and 46 deletions
|
@ -108,26 +108,16 @@ public:
|
||||||
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket(this->taskProcessor.ioContext, this->ctx);
|
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket(this->taskProcessor.ioContext, this->ctx);
|
||||||
boost::asio::ip::tcp::resolver::iterator endpoint =
|
boost::asio::ip::tcp::resolver::iterator endpoint =
|
||||||
co_await this->resolver.async_resolve({request.request.url.host(), request.request.url.has_port() ? request.request.url.port() : request.request.url.scheme()}, boost::asio::use_awaitable);
|
co_await this->resolver.async_resolve({request.request.url.host(), request.request.url.has_port() ? request.request.url.port() : request.request.url.scheme()}, boost::asio::use_awaitable);
|
||||||
auto [ec, _] = co_await boost::asio::async_connect(socket.lowest_layer(), endpoint, boost::asio::as_tuple(boost::asio::use_awaitable));
|
co_await boost::asio::async_connect(socket.lowest_layer(), endpoint, boost::asio::use_awaitable);
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
co_await socket.async_handshake(boost::asio::ssl::stream_base::client, boost::asio::use_awaitable);
|
||||||
};
|
|
||||||
co_await socket.async_handshake(boost::asio::ssl::stream_base::client, boost::asio::redirect_error(boost::asio::use_awaitable, ec));
|
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
|
||||||
};
|
|
||||||
std::string req(request.request.ToString());
|
std::string req(request.request.ToString());
|
||||||
co_await boost::asio::async_write(socket, boost::asio::buffer(req.data(), req.size()), boost::asio::transfer_all(), boost::asio::redirect_error(boost::asio::use_awaitable, ec));
|
co_await boost::asio::async_write(socket, boost::asio::buffer(req.data(), req.size()), boost::asio::transfer_all(), boost::asio::use_awaitable);
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
|
||||||
};
|
|
||||||
auto response = co_await this->ReadHeaders(socket, flags...);
|
auto response = co_await this->ReadHeaders(socket, flags...);
|
||||||
if constexpr(kUseStreaming) {
|
if constexpr(kUseStreaming) {
|
||||||
co_return clients::http::Response<HttpClient<TaskProcessor>, decltype(socket)>{*this, std::move(socket), std::move(response)};
|
co_return clients::http::Response<HttpClient<TaskProcessor>, decltype(socket)>{*this, std::move(socket), std::move(response)};
|
||||||
} else {
|
} else {
|
||||||
if(response.statusCode != 200) {
|
|
||||||
co_return response;
|
|
||||||
};
|
|
||||||
if(response.headers.contains("Content-Length")) {
|
if(response.headers.contains("Content-Length")) {
|
||||||
auto size = std::stoi(response.headers["Content-Length"]);
|
auto size = std::stoi(response.headers["Content-Length"]);
|
||||||
response.body = co_await ReadBody(std::move(socket), size, flags...);
|
response.body = co_await ReadBody(std::move(socket), size, flags...);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <cserver/engine/coroutine.hpp>
|
#include <cserver/engine/coroutine.hpp>
|
||||||
#include <cserver/utils/boost_error_wrapper.hpp>
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
|
|
||||||
|
@ -11,17 +10,11 @@ struct HTTPStream {
|
||||||
std::stringstream stream = {};
|
std::stringstream stream = {};
|
||||||
inline auto SetMethod(std::string method) -> Task<void> {
|
inline auto SetMethod(std::string method) -> Task<void> {
|
||||||
method += " ";
|
method += " ";
|
||||||
auto [ec, n] = co_await boost::asio::async_write(this->socket, boost::asio::buffer(method.data(), method.size()), boost::asio::transfer_all(), boost::asio::as_tuple(boost::asio::use_awaitable));
|
co_await boost::asio::async_write(this->socket, boost::asio::buffer(method.data(), method.size()), boost::asio::transfer_all(), boost::asio::use_awaitable);
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
inline auto SetStatus(std::string status) -> Task<void> {
|
inline auto SetStatus(std::string status) -> Task<void> {
|
||||||
status = fmt::format("HTTP/1.1 {}\r\n", std::move(status));
|
status = fmt::format("HTTP/1.1 {}\r\n", std::move(status));
|
||||||
auto [ec, n] = co_await boost::asio::async_write(this->socket, boost::asio::buffer(status.data(), status.size()), boost::asio::transfer_all(), boost::asio::as_tuple(boost::asio::use_awaitable));
|
co_await boost::asio::async_write(this->socket, boost::asio::buffer(status.data(), status.size()), boost::asio::transfer_all(), boost::asio::use_awaitable);
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto SetHeader(std::string first, std::string second) -> Task<void> {
|
inline auto SetHeader(std::string first, std::string second) -> Task<void> {
|
||||||
|
@ -31,16 +24,10 @@ struct HTTPStream {
|
||||||
inline auto SetEndOfHeaders() -> Task<void> {
|
inline auto SetEndOfHeaders() -> Task<void> {
|
||||||
this->stream << "\r\n";
|
this->stream << "\r\n";
|
||||||
auto str = this->stream.str();
|
auto str = this->stream.str();
|
||||||
auto [ec, n] = co_await boost::asio::async_write(this->socket, boost::asio::buffer(str.data(), str.size()), boost::asio::transfer_all(), boost::asio::as_tuple(boost::asio::use_awaitable));
|
co_await boost::asio::async_write(this->socket, boost::asio::buffer(str.data(), str.size()), boost::asio::transfer_all(), boost::asio::use_awaitable);
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
inline auto PushBodyChunk(std::string_view chunk) -> Task<void> {
|
inline auto PushBodyChunk(std::string_view chunk) -> Task<void> {
|
||||||
auto [ec, n] = co_await boost::asio::async_write(this->socket, boost::asio::buffer(chunk.data(), chunk.size()), boost::asio::transfer_all(), boost::asio::as_tuple(boost::asio::use_awaitable));
|
co_await boost::asio::async_write(this->socket, boost::asio::buffer(chunk.data(), chunk.size()), boost::asio::transfer_all(), boost::asio::use_awaitable);
|
||||||
if(ec) {
|
|
||||||
throw BoostErrorWrapper{ec};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
inline auto Close() -> Task<void> {
|
inline auto Close() -> Task<void> {
|
||||||
this->socket.close();
|
this->socket.close();
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include <boost/system/error_code.hpp>
|
|
||||||
|
|
||||||
namespace cserver {
|
|
||||||
|
|
||||||
struct BoostErrorWrapper : std::exception, boost::system::error_code {
|
|
||||||
std::string errorMessage;
|
|
||||||
BoostErrorWrapper(boost::system::error_code ec) : errorMessage(ec.what()) {};
|
|
||||||
auto what() const noexcept -> const char* override {
|
|
||||||
return this->errorMessage.c_str();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace cserver
|
|
Loading…
Reference in a new issue