diff options
| author | Grégoire Duchêne <gduchene@awhk.org> | 2022-06-18 12:52:57 +0100 |
|---|---|---|
| committer | Grégoire Duchêne <gduchene@awhk.org> | 2022-06-18 12:52:57 +0100 |
| commit | 41a47c757dca86ec0684b060bdd1d3c4d55cc81f (patch) | |
| tree | 949e038cb7dd2166c41cedc7fc70122855f6656b /http.go | |
| parent | d38a4ae585bb5061b264c667d65f2adf922934a7 (diff) | |
Add FilterHTTPMethod and FilteringHTTPHandler
Diffstat (limited to 'http.go')
| -rw-r--r-- | http.go | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: © 2022 Grégoire Duchêne <gduchene@awhk.org> +// SPDX-License-Identifier: ISC + +package core + +import ( + "net/http" + "sort" + "strings" +) + +// FilteringHTTPHandler returns a handler that will check that a request +// was not filtered before handing it over to the passed handler. +func FilteringHTTPHandler(handler http.Handler, filters ...HTTPFilterFunc) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + for _, filter := range filters { + if filter(w, req) { + return + } + } + handler.ServeHTTP(w, req) + }) +} + +// HTTPFilterFunc describes a filtering function for HTTP headers. The +// filtering function must return true if a request should be filtered +// and false otherwise. The filtering function may only call functions +// on the http.ResponseWriter or change the http.Request if a request is +// filtered. +type HTTPFilterFunc func(http.ResponseWriter, *http.Request) bool + +// FilterHTTPMethod is an HTTPFilterFunc that filters requests based on +// the HTTP methods passed. Requests that do not have a matching method +// will be filtered. +func FilterHTTPMethod(methods ...string) HTTPFilterFunc { + sort.Strings(methods) + allowed := strings.Join(methods, ", ") + return func(w http.ResponseWriter, req *http.Request) bool { + for _, method := range methods { + if method == req.Method { + return false + } + } + w.Header().Set("Allowed", allowed) + w.WriteHeader(http.StatusMethodNotAllowed) + return true + } +} |
