🍯 Glaze

package http

import "core:strings"

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

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

headers_get :: proc(headers: []Header, name: string) -> [dynamic]string {
	l_name := strings.to_lower(name)
	defer delete(l_name)

	values := make([dynamic]string, 0, 2)
	for h in headers {
		if h.name == l_name {
			append(&values, h.value)
		}
	}
	return values
}

headers_get_first :: proc(headers: []Header, name: string) -> (string, bool) {
	l_name := strings.to_lower(name)
	defer delete(l_name)

	for h in headers {
		if h.name == l_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
	}

	parts := strings.split(v, ",")
	defer delete(parts)
	l_token := strings.to_lower(token)
	defer delete(l_token)

	for p in parts {
		l_p := strings.to_lower(strings.trim_space(p))
		defer delete(l_p)
		if l_p == l_token {
			return true
		}
	}
	return false
}