aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoradnano <[email protected]>2020-10-12 13:50:07 -0400
committeradnano <[email protected]>2020-10-12 16:34:12 -0400
commit2370c42d8d862ee117576d72b7acaf76f8622397 (patch)
tree7e58300e3c85a2c9a2c31a87ab259371296e9ec8
parentUpdate examples (diff)
downloadgo-gemini-2370c42d8d862ee117576d72b7acaf76f8622397.tar.xz
go-gemini-2370c42d8d862ee117576d72b7acaf76f8622397.zip
Use a map for registering server handlers
-rw-r--r--server.go48
1 files changed, 27 insertions, 21 deletions
diff --git a/server.go b/server.go
index a131fba..47b9bb0 100644
--- a/server.go
+++ b/server.go
@@ -36,28 +36,40 @@ type Server struct {
GetCertificate func(hostname string) *tls.Certificate
// registered handlers
- handlers []handlerEntry
+ handlers map[handlerKey]Handler
}
-// Handle registers a handler for the given host.
+type handlerKey struct {
+ Scheme string
+ Host string
+}
+
+// Handle registers a handler for the given hostname.
// A default scheme of gemini:// is assumed.
-func (s *Server) Handle(host string, handler Handler) {
- if host == "" {
- panic("gmi: invalid host")
+func (s *Server) Handle(hostname string, handler Handler) {
+ if hostname == "" {
+ panic("gmi: invalid hostname")
}
if handler == nil {
panic("gmi: nil handler")
}
- s.HandleScheme("gemini", host, handler)
+ if s.handlers == nil {
+ s.handlers = map[handlerKey]Handler{}
+ }
+ s.HandleScheme("gemini", hostname, handler)
}
-// HandleScheme registers a handler for the given scheme and host.
-func (s *Server) HandleScheme(scheme string, host string, handler Handler) {
- s.handlers = append(s.handlers, handlerEntry{
- scheme,
- host,
- handler,
- })
+func (s *Server) HandleFunc(hostname string, handler func(*ResponseWriter, *Request)) {
+ s.Handle(hostname, HandlerFunc(handler))
+}
+
+// HandleScheme registers a handler for the given scheme and hostname.
+func (s *Server) HandleScheme(scheme string, hostname string, handler Handler) {
+ s.handlers[handlerKey{scheme, hostname}] = handler
+}
+
+func (s *Server) HandleSchemeFunc(scheme string, hostname string, handler func(*ResponseWriter, *Request)) {
+ s.HandleScheme(scheme, hostname, HandlerFunc(handler))
}
type handlerEntry struct {
@@ -228,14 +240,8 @@ func (s *Server) respond(conn net.Conn) {
}
func (s *Server) handler(req *Request) Handler {
- for _, e := range s.handlers {
- if req.URL.Scheme != e.scheme {
- continue
- }
- // Allow host or bare hostname
- if req.URL.Host == e.host || req.Hostname() == e.host {
- return e.h
- }
+ if h, ok := s.handlers[handlerKey{req.URL.Scheme, req.Hostname()}]; ok {
+ return h
}
return NotFoundHandler()
}