From: Kevin Wolf <kwolf@redhat.com>
To: Michael Tokarev <mjt@tls.msk.ru>
Cc: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>,
qemu-block@nongnu.org, qemu-devel@nongnu.org, hreitz@redhat.com,
qemu-trivial@nongnu.org
Subject: Re: [PATCH] block/curl: rewrite http header parsing function
Date: Thu, 18 Jul 2024 20:54:13 +0200 [thread overview]
Message-ID: <Zplk1RLrHl0VIrBO@redhat.com> (raw)
In-Reply-To: <20240629142542.1086076-1-mjt@tls.msk.ru>
Am 29.06.2024 um 16:25 hat Michael Tokarev geschrieben:
> Existing code was long, unclear and twisty.
>
> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
> ---
> block/curl.c | 44 ++++++++++++++++++--------------------------
> 1 file changed, 18 insertions(+), 26 deletions(-)
>
> diff --git a/block/curl.c b/block/curl.c
> index 419f7c89ef..9802d0319d 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -210,37 +210,29 @@ static size_t curl_header_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
> {
> BDRVCURLState *s = opaque;
> size_t realsize = size * nmemb;
> - const char *header = (char *)ptr;
> - const char *end = header + realsize;
> - const char *accept_ranges = "accept-ranges:";
> - const char *bytes = "bytes";
> + const char *p = ptr;
> + const char *end = p + realsize;
> + const char *t = "accept-ranges : bytes "; /* A lowercase template */
I don't think spaces between the field name and the colon are allowed
in the spec (and in the old code), only before and after the value.
> - if (realsize >= strlen(accept_ranges)
> - && g_ascii_strncasecmp(header, accept_ranges,
> - strlen(accept_ranges)) == 0) {
> -
> - char *p = strchr(header, ':') + 1;
> -
> - /* Skip whitespace between the header name and value. */
> - while (p < end && *p && g_ascii_isspace(*p)) {
> - p++;
> - }
> -
> - if (end - p >= strlen(bytes)
> - && strncmp(p, bytes, strlen(bytes)) == 0) {
> -
> - /* Check that there is nothing but whitespace after the value. */
> - p += strlen(bytes);
> - while (p < end && *p && g_ascii_isspace(*p)) {
> - p++;
> - }
> -
> - if (p == end || !*p) {
> - s->accept_range = true;
> + /* check if header matches the "t" template */
> + for (;;) {
> + if (*t == ' ') { /* space in t matches any amount of isspace in p */
> + if (p < end && g_ascii_isspace(*p)) {
> + ++p;
> + } else {
> + ++t;
> }
> + } else if (*t && p < end && *t == g_ascii_tolower(*p)) {
> + ++p, ++t;
> + } else {
> + break;
> }
> }
>
> + if (!*t && p == end) { /* if we managed to reach ends of both strings */
> + s->accept_range = true;
> + }
Maybe make the generic comparison with a template a separate function
(maybe even in cutils.c?) so that curl_header_cb() essentially only has
something like this any more:
if (!qemu_memcasecmp_space(ptr, end, "accept-ranges: bytes ")) {
s->accept_range = true;
}
(A better name for the function would be preferable, of course. Maybe
also a bool return value, but if it has a name related to memcmp() or
strcmp(), then 0 must mean it matches.)
Then this would really highlight the curl specific logic rather than the
string parser in curl_header_cb().
Kevin
prev parent reply other threads:[~2024-07-18 18:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-29 14:25 [PATCH] block/curl: rewrite http header parsing function Michael Tokarev
2024-07-01 6:54 ` Vladimir Sementsov-Ogievskiy
2024-07-01 6:55 ` Michael Tokarev
2024-07-01 7:03 ` Vladimir Sementsov-Ogievskiy
2024-07-18 18:54 ` Kevin Wolf [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zplk1RLrHl0VIrBO@redhat.com \
--to=kwolf@redhat.com \
--cc=hreitz@redhat.com \
--cc=mjt@tls.msk.ru \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-trivial@nongnu.org \
--cc=vsementsov@yandex-team.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.