summaryrefslogtreecommitdiff
path: root/gemini/handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'gemini/handler.go')
-rw-r--r--gemini/handler.go29
1 files changed, 29 insertions, 0 deletions
diff --git a/gemini/handler.go b/gemini/handler.go
new file mode 100644
index 0000000..ded77a5
--- /dev/null
+++ b/gemini/handler.go
@@ -0,0 +1,29 @@
+package gemini
+
+import "context"
+
+// Handler is a function which can turn a gemini request into a gemini response.
+//
+// A Handler MUST NOT return a nil response. Errors should be returned in the form
+// of error responses (4x, 5x, 6x response status). If the Handler should not be
+// responsible for the requested resource it can return a "51 Not Found" response.
+type Handler func(context.Context, *Request) *Response
+
+// Middleware is a handle decorator.
+//
+// It returns a handler which may call the passed-in handler or not, or may
+// transform the request or response in some way.
+type Middleware func(Handler) Handler
+
+func Fallthrough(handlers ...Handler) Handler {
+ return func(ctx context.Context, req *Request) *Response {
+ for _, handler := range handlers {
+ response := handler(ctx, req)
+ if response.Status != StatusNotFound {
+ return response
+ }
+ }
+
+ return NotFound("Resource does not exist.")
+ }
+}