http.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: LicenseRef-MutuaL-1.2
 4
 5package mcp
 6
 7import (
 8	"crypto/subtle"
 9	"net/http"
10	"strings"
11)
12
13func requireBearerToken(token string, next http.Handler) http.Handler {
14	if token == "" {
15		return next
16	}
17
18	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
19		scheme, value, ok := strings.Cut(r.Header.Get("Authorization"), " ")
20		if !ok || !strings.EqualFold(scheme, "Bearer") ||
21			subtle.ConstantTimeCompare([]byte(value), []byte(token)) != 1 {
22			w.Header().Set("WWW-Authenticate", "Bearer")
23			http.Error(w, "unauthorized", http.StatusUnauthorized)
24			return
25		}
26
27		next.ServeHTTP(w, r)
28	})
29}