🍯 Glaze

package http

import "core:strings"

Header :: struct {
	name:  string,
	value: string,
}

headers_add :: proc(headers: ^[dynamic]Header, name, value: string) {
	append(headers, Header{name = strings.to_lower(name), value = strings.clone(strings.trim_space(value))})
}

headers_get :: proc(headers: []Header, name: string) -> [dynamic]string {
	values := make([dynamic]string, 0, 2)
	for h in headers {
		if strings.equal_fold(h.name, name) {
			append(&values, h.value)
		}
	}
	return values
}

headers_get_first :: proc(headers: []Header, name: string) -> (string, bool) {
	for h in headers {
		if strings.equal_fold(h.name, name) {
			return h.value, true
		}
	}
	return "", false
}

header_has_token :: proc(headers: []Header, name, token: string) -> bool {
	v, ok := headers_get_first(headers, name)
	if !ok {
		return false
	}

	rest := v
	for part in strings.split_iterator(&rest, ",") {
		if strings.equal_fold(strings.trim_space(part), token) {
			return true
		}
	}
	return false
}