diff --git a/handler/handler.go b/handler/handler.go index 5dd78a9..e682f12 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -8,31 +8,47 @@ import ( //go:embed static/index.html var indexPage string -func New(matrixHostname, matrixBaseURL string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet && r.Method != http.MethodHead { - w.WriteHeader(http.StatusMethodNotAllowed) - w.Write([]byte("405 method not allowed\n")) - return - } +type Params struct { + MatrixHostname string + MatrixBaseURL string + RootPath string +} - switch r.URL.Path { - case "/.well-known/matrix/server": - w.Header().Add("content-type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write([]byte(`{"m.server": "` + matrixHostname + `"}`)) - case "/.well-known/matrix/client": - w.Header().Add("content-type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write([]byte(`{"m.homeserver": {"base_url": "` + matrixBaseURL + `"}}`)) - case "/": - w.Header().Add("content-type", "text/html") - w.WriteHeader(http.StatusOK) - if r.Method == http.MethodGet { - w.Write([]byte(indexPage)) - } - default: - http.NotFound(w, r) - } +type handler struct { + *http.ServeMux + params Params +} + +func New(params Params) http.Handler { + h := &handler{ + ServeMux: http.NewServeMux(), + params: params, + } + + h.Handle("GET /.well-known/matrix/server", http.HandlerFunc(h.getMatrixServer)) + h.Handle("GET /.well-known/matrix/client", http.HandlerFunc(h.getMatrixClient)) + h.Handle("GET /{$}", http.HandlerFunc(h.getHomepage)) + h.Handle("GET /", http.FileServer(http.Dir(params.RootPath))) + + return h +} + +func (h *handler) getMatrixServer(w http.ResponseWriter, r *http.Request) { + w.Header().Add("content-type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"m.server": "` + h.params.MatrixHostname + `"}`)) +} + +func (h *handler) getMatrixClient(w http.ResponseWriter, r *http.Request) { + w.Header().Add("content-type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"m.homeserver": {"base_url": "` + h.params.MatrixBaseURL + `"}}`)) +} + +func (h *handler) getHomepage(w http.ResponseWriter, r *http.Request) { + w.Header().Add("content-type", "text/html") + w.WriteHeader(http.StatusOK) + if r.Method == http.MethodGet { + w.Write([]byte(indexPage)) } } diff --git a/handler/handler_test.go b/handler/handler_test.go index e539b00..28aa533 100644 --- a/handler/handler_test.go +++ b/handler/handler_test.go @@ -1,7 +1,7 @@ package handler_test import ( - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -41,6 +41,14 @@ func TestHandler(t *testing.T) { wantStatusCode: http.StatusOK, wantBody: `{"m.homeserver": {"base_url": "https://foo.example.com"}}`, }, + { + name: "GET /test.html", + method: http.MethodGet, + path: "/test.html", + wantContentType: "text/html; charset=utf-8", + wantStatusCode: http.StatusOK, + wantBody: "\n
\n