#include #include #include #include #include #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;is[i]) != prefix[i]) return 0; return 1; } int parse_token(buffer *b, stralloc *result) { stralloc line; int r; stralloc_init(result); 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; }