aboutsummaryrefslogtreecommitdiff
path: root/http.go
diff options
context:
space:
mode:
authorGrégoire Duchêne <gduchene@awhk.org>2022-06-18 12:52:57 +0100
committerGrégoire Duchêne <gduchene@awhk.org>2022-06-18 12:52:57 +0100
commit41a47c757dca86ec0684b060bdd1d3c4d55cc81f (patch)
tree949e038cb7dd2166c41cedc7fc70122855f6656b /http.go
parentd38a4ae585bb5061b264c667d65f2adf922934a7 (diff)
Add FilterHTTPMethod and FilteringHTTPHandler
Diffstat (limited to 'http.go')
-rw-r--r--http.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/http.go b/http.go
new file mode 100644
index 0000000..83a6830
--- /dev/null
+++ b/http.go
@@ -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
+ }
+}