0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-26 15:33:54 +01:00

ircd::http: Grammar exception translator can be made aware of request vs. response.

This commit is contained in:
Jason Volk 2018-03-19 14:40:04 -07:00
parent daae800cc1
commit bf91eb6883
2 changed files with 37 additions and 5 deletions

View file

@ -262,6 +262,7 @@ struct ircd::http::request::head
struct ircd::http::response
{
struct head;
struct chunk;
// compose a response into buffer
response(window_buffer &,
@ -291,6 +292,15 @@ struct ircd::http::response::head
head() = default;
};
struct ircd::http::response::chunk
:line
{
size_t size {0};
chunk(parse::capstan &pc);
chunk() = default;
};
template<class T>
T
ircd::http::query::string::get(const string_view &key,

View file

@ -19,7 +19,7 @@ namespace ircd::http
extern const std::unordered_map<ircd::http::code, ircd::string_view> reason;
[[noreturn]] void throw_error(const qi::expectation_failure<const char *> &);
[[noreturn]] void throw_error(const qi::expectation_failure<const char *> &, const bool &internal = false);
}
BOOST_FUSION_ADAPT_STRUCT
@ -675,19 +675,41 @@ ircd::http::writeline(window_buffer &write)
});
}
/// Called to translate a grammar exception into an http::error within our
/// system. This will then usually propagate back to our client.
///
/// If we are a client to another server, set internal=true. Even though this
/// still generates an HTTP error, the code is 500 so if it propagates back to
/// a client it does not indicate to *that* client that *they* made a bad
/// request from a 400 back to them.
void
ircd::http::throw_error(const qi::expectation_failure<const char *> &e)
ircd::http::throw_error(const qi::expectation_failure<const char *> &e,
const bool &internal)
{
const auto rule
const auto &code_
{
internal?
code::INTERNAL_SERVER_ERROR:
code::BAD_REQUEST
};
const char *const &fmtstr
{
internal?
"I expected a valid HTTP %s. Server sent %zu invalid characters starting with `%s'.":
"I require a valid HTTP %s. You sent %zu invalid characters starting with `%s'."
};
const auto &rule
{
ircd::string(e.what_)
};
throw error
{
code::BAD_REQUEST, fmt::snstringf
code_, fmt::snstringf
{
512, "I require a valid HTTP %s. You sent %zu invalid characters starting with `%s'.",
512, fmtstr,
between(rule, "<", ">"),
size_t(e.last - e.first),
string_view{e.first, e.last}