0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-26 00:32:35 +01:00

ircd: Split out allow methods list generator.

This commit is contained in:
Jason Volk 2018-03-11 10:17:37 -07:00
parent a2be4d3ee5
commit ba6832b420
2 changed files with 22 additions and 12 deletions

View file

@ -35,6 +35,8 @@ struct ircd::resource
std::map<string_view, method *> methods; std::map<string_view, method *> methods;
unique_const_iterator<decltype(resources)> resources_it; unique_const_iterator<decltype(resources)> resources_it;
string_view allow_methods_list(const mutable_buffer &buf);
private: private:
virtual void handle_request(client &, method &, resource::request &); virtual void handle_request(client &, method &, resource::request &);

View file

@ -312,10 +312,7 @@ ircd::resource::handle_request(client &client,
resource::request &request) resource::request &request)
try try
{ {
const auto response method(client, request);
{
method(client, request)
};
} }
catch(const json::not_found &e) catch(const json::not_found &e)
{ {
@ -360,9 +357,26 @@ try
return *methods.at(name); return *methods.at(name);
} }
catch(const std::out_of_range &e) catch(const std::out_of_range &e)
{
char buf[128];
const http::header headers[]
{
{ "Allow", allow_methods_list(buf) }
};
throw http::error
{
http::METHOD_NOT_ALLOWED, {}, headers
};
}
ircd::string_view
ircd::resource::allow_methods_list(const mutable_buffer &buf)
{ {
size_t len(0); size_t len(0);
char buf[128]; buf[0] = '\0'; if(likely(size(buf)))
buf[len] = '\0';
auto it(begin(methods)); auto it(begin(methods));
if(it != end(methods)) if(it != end(methods))
{ {
@ -374,13 +388,7 @@ catch(const std::out_of_range &e)
} }
} }
throw http::error return { data(buf), len };
{
http::METHOD_NOT_ALLOWED, {},
{
{ "Allow", string_view{buf, len} }
}
};
} }
ircd::resource::method::method(struct resource &resource, ircd::resource::method::method(struct resource &resource,