Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
[squash] go with Joyee’s suggestion
  • Loading branch information
addaleax committed Jan 13, 2018
commit 821cf9676f8ea7e1af35259ef82ee1a41a2a31ab
34 changes: 15 additions & 19 deletions src/node_http_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -738,36 +738,32 @@ class Parser : public AsyncWrap {

// These are helper functions for filling `http_parser_settings`, which turn
// a member function of Parser into a C-style HTTP parser callback.
template <int (Parser::* Member)()>
struct HTTPCallback {
static int Raw(http_parser* p) {
template <typename Parser, Parser> struct Proxy;
template <typename Parser, typename ...Args, int (Parser::*Member)(Args...)>
struct Proxy<int (Parser::*)(Args...), Member> {
static int Raw(http_parser* p, Args ... args) {
Parser* parser = ContainerOf(&Parser::parser_, p);
return (parser->*Member)();
return (parser->*Member)(std::forward<Args>(args)...);
}
};

template <int (Parser::* Member)(const char* at, size_t length)>
struct HTTPDataCallback {
static int Raw(http_parser* p, const char* at, size_t length) {
Parser* parser = ContainerOf(&Parser::parser_, p);
return (parser->*Member)(at, length);
}
};
typedef int (Parser::*Call)();
typedef int (Parser::*DataCall)(const char* at, size_t length);

static const struct http_parser_settings settings;

friend class ScopedRetainParser;
};

const struct http_parser_settings Parser::settings = {
HTTPCallback<&Parser::on_message_begin>::Raw,
HTTPDataCallback<&Parser::on_url>::Raw,
HTTPDataCallback<&Parser::on_status>::Raw,
HTTPDataCallback<&Parser::on_header_field>::Raw,
HTTPDataCallback<&Parser::on_header_value>::Raw,
HTTPCallback<&Parser::on_headers_complete>::Raw,
HTTPDataCallback<&Parser::on_body>::Raw,
HTTPCallback<&Parser::on_message_complete>::Raw,
Proxy<Call, &Parser::on_message_begin>::Raw,
Proxy<DataCall, &Parser::on_url>::Raw,
Proxy<DataCall, &Parser::on_status>::Raw,
Proxy<DataCall, &Parser::on_header_field>::Raw,
Proxy<DataCall, &Parser::on_header_value>::Raw,
Proxy<Call, &Parser::on_headers_complete>::Raw,
Proxy<DataCall, &Parser::on_body>::Raw,
Proxy<Call, &Parser::on_message_complete>::Raw,
nullptr, // on_chunk_header
nullptr // on_chunk_complete
};
Expand Down