nobotgate/parse_token.c
2026-09-09 20:02:39 +02:00

47 lines
1.1 KiB
C

#include <libowfat/stralloc.h>
#include <libowfat/buffer.h>
#include <libowfat/errmsg.h>
#include <libowfat/str.h>
#include <ctype.h>
#define AUTH_HEADER "authorization: bearer "
#define AUTH_HEADER_LEN str_len(AUTH_HEADER)
static int startswithlower(stralloc *sa, char *prefix, size_t prefixlen)
{
size_t i;
if (sa->len < prefixlen) return 0;
for (i=0;i<prefixlen;i++)
if (tolower(sa->s[i]) != prefix[i])
return 0;
return 1;
}
int parse_token(buffer *b, stralloc *result)
{
stralloc line;
int r;
stralloc_init(result);
stralloc_init(&line);
for (;;) {
r=buffer_getnewline_sa(b,&line);
if (r==0) break;
if (r<0) { carpsys("read line"); goto err; }
/* header field names are case-sensitive
* https://www.rfc-editor.org/info/rfc7230/#section-3.2 */
if (startswithlower(&line,AUTH_HEADER,AUTH_HEADER_LEN)) {
stralloc_chomp(&line);
if (!stralloc_copyb(result, line.s+AUTH_HEADER_LEN,
line.len-AUTH_HEADER_LEN)
) { carpsys("out of memory"); goto err; }
break;
}
}
stralloc_free(&line);
return 1;
err:
stralloc_free(&line);
return 0;
}