All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] block/curl: Improve HTTP header parsing
@ 2020-02-19 13:27 David Edmondson
  2020-02-19 13:27 ` [PATCH 1/2] block/curl: HTTP header fields allow whitespace around values David Edmondson
  2020-02-19 13:27 ` [PATCH 2/2] block/curl: HTTP header field names are case insensitive David Edmondson
  0 siblings, 2 replies; 4+ messages in thread
From: David Edmondson @ 2020-02-19 13:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, David Edmondson, qemu-block, Max Reitz

An HTTP object store of my acquaintance returns "accept-ranges: bytes"
(all lower case) as a header, causing the QEMU curl backend to refuse
to talk to it. RFC 7230 says that HTTP headers are case insensitive,
so update the curl backend accordingly.

At the same time, allow for arbitrary white space around the HTTP
header field value, as required by the RFC.

David Edmondson (2):
  block/curl: HTTP header fields allow whitespace around values
  block/curl: HTTP header field names are case insensitive

 block/curl.c | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

-- 
2.24.1



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] block/curl: HTTP header fields allow whitespace around values
  2020-02-19 13:27 [PATCH 0/2] block/curl: Improve HTTP header parsing David Edmondson
@ 2020-02-19 13:27 ` David Edmondson
  2020-02-19 13:27 ` [PATCH 2/2] block/curl: HTTP header field names are case insensitive David Edmondson
  1 sibling, 0 replies; 4+ messages in thread
From: David Edmondson @ 2020-02-19 13:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, David Edmondson, qemu-block, Max Reitz

RFC 7230 section 3.2 indicates that whitespace is permitted between
the field name and field value and after the field value.

Signed-off-by: David Edmondson <david.edmondson@oracle.com>
---
 block/curl.c | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/block/curl.c b/block/curl.c
index f86299378e38..0cf99a4b31b8 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -214,11 +214,34 @@ 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 *accept_line = "Accept-Ranges: bytes";
+    const char *header = (char *)ptr;
+    const char *end = header + realsize;
+    const char *accept_ranges = "Accept-Ranges:";
+    const char *bytes = "bytes";
 
-    if (realsize >= strlen(accept_line)
-        && strncmp((char *)ptr, accept_line, strlen(accept_line)) == 0) {
-        s->accept_range = true;
+    if (realsize >= strlen(accept_ranges)
+        && strncmp(header, accept_ranges, strlen(accept_ranges)) == 0) {
+
+        char *p = strchr(header, ':') + 1;
+
+        /* Skip whitespace between the header name and value. */
+        while (p < end && *p && 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 && isspace(*p)) {
+                p++;
+            }
+
+            if (p == end || !*p) {
+                s->accept_range = true;
+            }
+        }
     }
 
     return realsize;
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] block/curl: HTTP header field names are case insensitive
  2020-02-19 13:27 [PATCH 0/2] block/curl: Improve HTTP header parsing David Edmondson
  2020-02-19 13:27 ` [PATCH 1/2] block/curl: HTTP header fields allow whitespace around values David Edmondson
@ 2020-02-19 13:27 ` David Edmondson
  2020-02-19 14:01   ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 4+ messages in thread
From: David Edmondson @ 2020-02-19 13:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, David Edmondson, qemu-block, Max Reitz

RFC 7230 section 3.2 indicates that HTTP header field names are case
insensitive.

Signed-off-by: David Edmondson <david.edmondson@oracle.com>
---
 block/curl.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/block/curl.c b/block/curl.c
index 0cf99a4b31b8..4256659cd85b 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -216,11 +216,11 @@ static size_t curl_header_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
     size_t realsize = size * nmemb;
     const char *header = (char *)ptr;
     const char *end = header + realsize;
-    const char *accept_ranges = "Accept-Ranges:";
+    const char *accept_ranges = "accept-ranges:";
     const char *bytes = "bytes";
 
     if (realsize >= strlen(accept_ranges)
-        && strncmp(header, accept_ranges, strlen(accept_ranges)) == 0) {
+        && strncasecmp(header, accept_ranges, strlen(accept_ranges)) == 0) {
 
         char *p = strchr(header, ':') + 1;
 
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] block/curl: HTTP header field names are case insensitive
  2020-02-19 13:27 ` [PATCH 2/2] block/curl: HTTP header field names are case insensitive David Edmondson
@ 2020-02-19 14:01   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 4+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-02-19 14:01 UTC (permalink / raw)
  To: David Edmondson, qemu-devel; +Cc: Kevin Wolf, qemu-block, Max Reitz

Hi David,

On 2/19/20 2:27 PM, David Edmondson wrote:
> RFC 7230 section 3.2 indicates that HTTP header field names are case
> insensitive.
> 
> Signed-off-by: David Edmondson <david.edmondson@oracle.com>
> ---
>   block/curl.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/block/curl.c b/block/curl.c
> index 0cf99a4b31b8..4256659cd85b 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -216,11 +216,11 @@ static size_t curl_header_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
>       size_t realsize = size * nmemb;
>       const char *header = (char *)ptr;
>       const char *end = header + realsize;
> -    const char *accept_ranges = "Accept-Ranges:";
> +    const char *accept_ranges = "accept-ranges:";
>       const char *bytes = "bytes";
>   
>       if (realsize >= strlen(accept_ranges)
> -        && strncmp(header, accept_ranges, strlen(accept_ranges)) == 0) {
> +        && strncasecmp(header, accept_ranges, strlen(accept_ranges)) == 0) {

Can you use g_ascii_strncasecmp() instead?

>   
>           char *p = strchr(header, ':') + 1;
>   
> 



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-02-19 14:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-19 13:27 [PATCH 0/2] block/curl: Improve HTTP header parsing David Edmondson
2020-02-19 13:27 ` [PATCH 1/2] block/curl: HTTP header fields allow whitespace around values David Edmondson
2020-02-19 13:27 ` [PATCH 2/2] block/curl: HTTP header field names are case insensitive David Edmondson
2020-02-19 14:01   ` Philippe Mathieu-Daudé

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.