diff -r 254326cbc1bc -r 947843245525 libidav/utils.c --- a/libidav/utils.c Thu Oct 15 16:16:44 2015 +0200 +++ b/libidav/utils.c Thu Oct 15 16:36:07 2015 +0200 @@ -286,65 +286,44 @@ static size_t util_header_callback(char *buffer, size_t size, size_t nitems, void *data) { - char *duped; // local variable for string duplicates + sstr_t sbuffer = sstrn(buffer, size*nitems); UcxMap *map = (UcxMap*) data; // if we get a status line, clear the map and exit - if(size*nitems >= 5 && !strncmp("HTTP/", buffer, 5)) { + if(sstrprefix(sbuffer, S("HTTP/"))) { ucx_map_free_content(map, free); ucx_map_clear(map); return size*nitems; } // if we get the terminating CRLF, just exit - if (size*nitems == 2 && !strncmp("\r\n", buffer, 2)) { + if(!sstrcmp(sbuffer, S("\r\n"))) { return 2; } + sstr_t key = sbuffer; + sstr_t value = sstrchr(sbuffer, ':'); - // get header key - size_t s = 0; - do { - s++; - } while(buffer[s] != ':'); - char *value = buffer+s+1; - - // remove trailing spaces - while(isspace(buffer[s-1])) { - s--; + if(value.length == 0) { + return 0; // invalid header line } - // save key as all lower case - duped = malloc(s); - for(size_t i = 0;i