Add assets handler to gemini
This commit is contained in:
parent
bde3751fab
commit
2ca44b60d4
@ -5,8 +5,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"mime"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.sr.ht/~adnano/go-gemini"
|
"git.sr.ht/~adnano/go-gemini"
|
||||||
@ -142,7 +144,7 @@ func postsMiddleware(tplHandler gemini.Handler) gemini.Handler {
|
|||||||
r *gemini.Request,
|
r *gemini.Request,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
id := strings.TrimPrefix(r.URL.Path, "/posts/")
|
id := path.Base(r.URL.Path)
|
||||||
id = strings.TrimSuffix(id, ".gmi")
|
id = strings.TrimSuffix(id, ".gmi")
|
||||||
|
|
||||||
if id == "index" {
|
if id == "index" {
|
||||||
@ -160,6 +162,37 @@ func postsMiddleware(tplHandler gemini.Handler) gemini.Handler {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *api) assetsMiddleware() gemini.Handler {
|
||||||
|
|
||||||
|
return gemini.HandlerFunc(func(
|
||||||
|
ctx context.Context,
|
||||||
|
rw gemini.ResponseWriter,
|
||||||
|
r *gemini.Request,
|
||||||
|
) {
|
||||||
|
|
||||||
|
id := path.Base(r.URL.Path)
|
||||||
|
mimeType := mime.TypeByExtension(path.Ext(id))
|
||||||
|
|
||||||
|
ctx = mctx.Annotate(ctx, "assetID", id, "mimeType", mimeType)
|
||||||
|
|
||||||
|
if mimeType != "" {
|
||||||
|
rw.SetMediaType(mimeType)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := a.params.PostAssetStore.Get(id, rw)
|
||||||
|
|
||||||
|
if errors.Is(err, post.ErrAssetNotFound) {
|
||||||
|
rw.WriteHeader(gemini.StatusNotFound, "Asset not found, sorry!")
|
||||||
|
return
|
||||||
|
|
||||||
|
} else if err != nil {
|
||||||
|
a.params.Logger.Error(ctx, "error fetching asset", err)
|
||||||
|
rw.WriteHeader(gemini.StatusTemporaryFailure, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (a *api) handler() (gemini.Handler, error) {
|
func (a *api) handler() (gemini.Handler, error) {
|
||||||
|
|
||||||
tplHandler, err := a.tplHandler()
|
tplHandler, err := a.tplHandler()
|
||||||
@ -169,6 +202,7 @@ func (a *api) handler() (gemini.Handler, error) {
|
|||||||
|
|
||||||
mux := new(gemini.Mux)
|
mux := new(gemini.Mux)
|
||||||
mux.Handle("/posts/", postsMiddleware(tplHandler))
|
mux.Handle("/posts/", postsMiddleware(tplHandler))
|
||||||
|
mux.Handle("/assets/", a.assetsMiddleware())
|
||||||
mux.Handle("/", tplHandler)
|
mux.Handle("/", tplHandler)
|
||||||
|
|
||||||
var h gemini.Handler
|
var h gemini.Handler
|
||||||
|
@ -200,7 +200,6 @@ func (a *api) tplHandler() (gemini.Handler, error) {
|
|||||||
tpl := allTpls.Lookup(tplPath)
|
tpl := allTpls.Lookup(tplPath)
|
||||||
|
|
||||||
if tpl == nil {
|
if tpl == nil {
|
||||||
a.params.Logger.WarnString(ctx, "page not found")
|
|
||||||
rw.WriteHeader(gemini.StatusNotFound, "Page not found, sorry!")
|
rw.WriteHeader(gemini.StatusNotFound, "Page not found, sorry!")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user