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:
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;
}