#include <libfilezilla/http/client.hpp>
using namespace std::literals;
typedef fz::http::client::request_response_holder<fz::http::client::request, fz::http::client::response> request_response;
{
public:
, fz::http::client::client(*this, buffer_pool, logger, "libfilezilla_https_demo")
, logger_(logger)
, trust_store_(pool_)
{
for (auto const& uri : uris) {
auto srr = std::make_shared<request_response>();
srr->request_.uri_ = uri;
srr->request_.headers_["Connection"] = "keep-alive";
if (add_request(srr)) {
requests_.push_back(srr);
}
}
if (requests_.empty()) {
event_loop_.stop();
}
}
~client()
{
remove_handler();
destroy();
}
{
destroy_socket();
socket_ = std::make_unique<fz::socket>(pool_, nullptr);
if (tls) {
tls_ = std::make_unique<fz::tls_layer>(event_loop_, nullptr, *socket_, &trust_store_, logger_);
tls_->client_handshake({}, {}, host);
return tls_.get();
}
else {
return socket_.get();
}
}
virtual void destroy_socket() override
{
tls_.reset();
socket_.reset();
}
{
fz::dispatch<fz::http::client::done_event>(ev, this, &client::on_request_done);
}
void on_request_done(uint64_t, bool success)
{
auto & srr = requests_.front();
if (success) {
logger_.log(
fz::logmsg::error,
"Got response for %s with code %d", srr->req().uri_.to_string(), srr->res().code_);
}
else {
logger_.log(
fz::logmsg::error,
"Could not read response for %s", srr->req().uri_.to_string());
}
requests_.pop_front();
if (requests_.empty()) {
event_loop_.stop();
}
}
std::unique_ptr<fz::socket> socket_;
std::unique_ptr<fz::tls_layer> tls_;
std::deque<fz::http::client::shared_request_response> requests_;
};
int main(int argc , char * argv[])
{
if (argc < 2) {
return 1;
}
std::vector<fz::uri> uris;
for (int i = 1; i < argc; ++i) {
if (!uri) {
return 1;
}
uris.emplace_back(std::move(uri));
}
client c(uris, loop, buffer_pool, logger);
loop.run();
return 0;
}