0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-16 15:00:51 +01:00

ircd: Loop the whole input tape before returning to async.

This commit is contained in:
Jason Volk 2017-03-13 16:11:30 -07:00
parent e849897cc0
commit 55be9a9f6d
3 changed files with 56 additions and 27 deletions

View file

@ -53,8 +53,8 @@ struct client
bool main() noexcept;
public:
explicit client(std::shared_ptr<socket>);
explicit client(const host_port &, const seconds &timeout = 5s);
client(std::shared_ptr<socket>);
client(const host_port &, const seconds &timeout = 5s);
client();
client(client &&) = delete;
client(const client &) = delete;

View file

@ -206,31 +206,50 @@ catch(const std::exception &e)
return false;
}
namespace ircd
{
void handle_request(client &client, parse::capstan &pc, const http::request::head &head);
bool handle_request(client &client, parse::capstan &pc);
} // namepace ircd
bool
ircd::client::serve()
try
{
char buffer[4096];
char buffer[2048];
parse::buffer pb{buffer, buffer + sizeof(buffer)};
parse::capstan pc{pb, read_closure(*this)};
parse::capstan pc{pb, read_closure(*this)}; do
{
if(!handle_request(*this, pc))
break;
pb.remove();
}
while(pc.unparsed());
return true;
}
catch(const std::exception &e)
{
log::error("client[%s] [500 Internal Error]: %s",
string(remote_addr(*this)).c_str(),
e.what());
return false;
}
bool
ircd::handle_request(client &client,
parse::capstan &pc)
try
{
http::request
{
pc, nullptr, write_closure(*this), [&]
(const http::request::head &head)
pc, nullptr, write_closure(client), [&client, &pc]
(const auto &head)
{
log::debug("client[%s] requesting resource \"%s\"",
string(remote_addr(*this)).c_str(),
std::string(head.resource).c_str());
try
{
const auto &resource(*resource::resources.at(head.resource));
resource(*this, pc, head);
}
catch(const std::out_of_range &e)
{
throw http::error(http::code::NOT_FOUND);
}
handle_request(client, pc, head);
}
};
@ -239,7 +258,7 @@ try
catch(const http::error &e)
{
log::debug("client[%s] http::error(%d): %s",
string(remote_addr(*this)).c_str(),
string(remote_addr(client)).c_str(),
int(e.code),
e.what());
@ -250,13 +269,23 @@ catch(const http::error &e)
default: return true;
}
}
catch(const std::exception &e)
{
log::error("client[%s] [500 Internal Error]: %s",
string(remote_addr(*this)).c_str(),
e.what());
return false;
void
ircd::handle_request(client &client,
parse::capstan &pc,
const http::request::head &head)
try
{
log::debug("client[%s] requesting resource \"%s\"",
string(remote_addr(client)).c_str(),
std::string(head.resource).c_str());
const auto &resource(*resource::resources.at(head.resource));
resource(client, pc, head);
}
catch(const std::out_of_range &e)
{
throw http::error(http::code::NOT_FOUND);
}
std::shared_ptr<ircd::client>

View file

@ -42,7 +42,7 @@ try
const auto port(lex_cast<uint16_t>(tok.at(1)));
ircd::client client
{
host_port{host, port}
{ host, port }
};
http::request