/* like strncasecmp but ignores ws characters */ static int httpHeaderStrCmp(const char *h1, const char *h2, int len) { int len1 = 0; int len2 = 0; assert(h1 && h2); /* fast check first */ if (!strncasecmp(h1, h2, len)) return 0; while (1) { const char c1 = xtoupper(h1[len1 += xcountws(h1 + len1)]); const char c2 = xtoupper(h2[len2 += xcountws(h2 + len2)]); if (c1 < c2) return -len1; if (c1 > c2) return +len1; if (!c1 && !c2) return 0; if (c1) len1++; if (c2) len2++; } /* NOTREACHED */ return 0; }
/* * iterates through a 0-terminated string of items separated by 'del's. * white space around 'del' is considered to be a part of 'del' * like strtok, but preserves the source, and can iterate several strings at once * * returns true if next item is found. * init pos with NULL to start iteration. */ int strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos) { size_t len; assert(str && item && pos); if (*pos) { if (!**pos) /* end of string */ return 0; else (*pos)++; } else { *pos = strBuf(*str); if (!*pos) return 0; } /* skip leading ws (ltrim) */ *pos += xcountws(*pos); *item = *pos; /* remember item's start */ /* find next delimiter */ *pos = strchr(*item, del); if (!*pos) /* last item */ *pos = *item + strlen(*item); len = *pos - *item; /* *pos points to del or '\0' */ /* rtrim */ while (len > 0 && xisspace((*item)[len - 1])) len--; if (ilen) *ilen = len; return len > 0; }
const char * httpHeaderGetAuth(const HttpHeader * hdr, http_hdr_type id, const char *auth_scheme) { const char *field; int l; assert(hdr && auth_scheme); field = httpHeaderGetStr(hdr, id); if (!field) /* no authorization field */ return NULL; l = strlen(auth_scheme); if (!l || strncasecmp(field, auth_scheme, l)) /* wrong scheme */ return NULL; field += l; if (!xisspace(*field)) /* wrong scheme */ return NULL; /* skip white space */ field += xcountws(field); if (!*field) /* no authorization cookie */ return NULL; return base64_decode(field); }