libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 33c06771bdf2b357c0659c6cec35813d3a515db1
parent c4f413682fb1423cd964a35d16cac9ff4584762b
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Fri, 13 Jun 2025 14:04:55 +0200

parse_http_std_method(): optimised

Diffstat:
Msrc/mhd2/stream_process_request.c | 120++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 91 insertions(+), 29 deletions(-)

diff --git a/src/mhd2/stream_process_request.c b/src/mhd2/stream_process_request.c @@ -461,35 +461,97 @@ parse_http_std_method (struct MHD_Connection *restrict connection) mhd_assert (NULL != m); mhd_assert (0 != len); - if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_GET) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_GET, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_GET; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_HEAD) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_HEAD, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_HEAD; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_POST) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_POST, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_POST; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_PUT) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_PUT, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_PUT; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_DELETE) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_DELETE, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_DELETE; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_CONNECT) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_CONNECT, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_CONNECT; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_OPTIONS) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_OPTIONS, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_OPTIONS; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_TRACE) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_TRACE, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_TRACE; - else if ((mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_ASTERISK) == len) && - (0 == memcmp (m, MHD_HTTP_METHOD_STR_ASTERISK, len))) - connection->rq.http_mthd = mhd_HTTP_METHOD_ASTERISK; - else - connection->rq.http_mthd = mhd_HTTP_METHOD_OTHER; + switch (len) + { + case 3: /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_GET) */ + /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_PUT) */ + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_GET)); + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_PUT)); + if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_GET, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_GET))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_GET; + return; + } + else if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_PUT, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_PUT))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_PUT; + return; + } + break; + case 4: /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_HEAD) */ + /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_POST) */ + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_HEAD)); + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_POST)); + if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_HEAD, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_HEAD))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_HEAD; + return; + } + else if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_POST, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_POST))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_POST; + return; + } + break; + case 6: /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_DELETE) */ + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_DELETE)); + if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_DELETE, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_DELETE))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_DELETE; + return; + } + break; + case 7: /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_CONNECT) */ + /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_OPTIONS) */ + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_CONNECT)); + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_OPTIONS)); + if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_CONNECT, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_CONNECT))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_CONNECT; + return; + } + else if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_OPTIONS, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_OPTIONS))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_OPTIONS; + return; + } + break; + case 5: /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_TRACE) */ + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_TRACE)); + if (0 == memcmp (m, + MHD_HTTP_METHOD_STR_TRACE, + mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_TRACE))) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_TRACE; + return; + } + break; + case 1: /* mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_ASTERISK) */ + mhd_assert (len == mhd_SSTR_LEN (MHD_HTTP_METHOD_STR_ASTERISK)); + if ('*' == m[0]) + { + connection->rq.http_mthd = mhd_HTTP_METHOD_ASTERISK; + return; + } + break; + default: + break; /* Handled after the "switch()" body */ + } + connection->rq.http_mthd = mhd_HTTP_METHOD_OTHER; }