summaryrefslogtreecommitdiff
path: root/src/gmi/gmi.go
diff options
context:
space:
mode:
authorBrian Picciano <mediocregopher@gmail.com>2023-01-21 16:01:52 +0100
committerBrian Picciano <mediocregopher@gmail.com>2023-01-21 16:01:52 +0100
commit7878db5c95e5eb430b7b878fe6eb8084f15441a7 (patch)
treeba440b7d7ee8c67aa40fe5d0a0b5331b3d693312 /src/gmi/gmi.go
parent84c1322c44c68c19e88f9695ded286b26d1621aa (diff)
Initial implementation of post rendering over gmi
Diffstat (limited to 'src/gmi/gmi.go')
-rw-r--r--src/gmi/gmi.go55
1 files changed, 49 insertions, 6 deletions
diff --git a/src/gmi/gmi.go b/src/gmi/gmi.go
index 6e2d79f..7d4d186 100644
--- a/src/gmi/gmi.go
+++ b/src/gmi/gmi.go
@@ -12,6 +12,7 @@ import (
"git.sr.ht/~adnano/go-gemini"
"git.sr.ht/~adnano/go-gemini/certificate"
"github.com/mediocregopher/blog.mediocregopher.com/srv/cfg"
+ "github.com/mediocregopher/blog.mediocregopher.com/srv/post"
"github.com/mediocregopher/mediocre-go-lib/v2/mctx"
"github.com/mediocregopher/mediocre-go-lib/v2/mlog"
)
@@ -19,7 +20,11 @@ import (
// Params are used to instantiate a new API instance. All fields are required
// unless otherwise noted.
type Params struct {
- Logger *mlog.Logger
+ Logger *mlog.Logger
+
+ PostStore post.Store
+ PostAssetStore post.AssetStore
+
PublicURL *url.URL
ListenAddr string
CertificatesPath string
@@ -86,9 +91,14 @@ func New(params Params) (API, error) {
params: params,
}
+ handler, err := a.handler()
+ if err != nil {
+ return nil, fmt.Errorf("constructing handler: %w", err)
+ }
+
a.srv = &gemini.Server{
Addr: params.ListenAddr,
- Handler: a.handler(),
+ Handler: handler,
GetCertificate: certStore.Get,
}
@@ -109,14 +119,47 @@ func (a *api) Shutdown(ctx context.Context) error {
return a.srv.Shutdown(ctx)
}
-func (a *api) handler() gemini.Handler {
+func postsMiddleware(tplHandler gemini.Handler) gemini.Handler {
+
return gemini.HandlerFunc(func(
ctx context.Context,
rw gemini.ResponseWriter,
r *gemini.Request,
) {
- fmt.Fprintf(rw, "# Test\n\n")
- fmt.Fprintf(rw, "HELLO WORLD\n\n")
- fmt.Fprintf(rw, "=> gemini://midnight.pub Hit the pub\n\n")
+
+ id := strings.TrimPrefix(r.URL.Path, "/posts/")
+ id = strings.TrimSuffix(id, ".gmi")
+
+ if id == "index" {
+ tplHandler.ServeGemini(ctx, rw, r)
+ return
+ }
+
+ query := r.URL.Query()
+ query.Set("id", id)
+ r.URL.RawQuery = query.Encode()
+
+ r.URL.Path = "/posts/post.gmi"
+
+ tplHandler.ServeGemini(ctx, rw, r)
})
}
+
+func (a *api) handler() (gemini.Handler, error) {
+
+ tplHandler, err := a.tplHandler()
+ if err != nil {
+ return nil, fmt.Errorf("generating tpl handler: %w", err)
+ }
+
+ mux := new(gemini.Mux)
+ mux.Handle("/posts/", postsMiddleware(tplHandler))
+ mux.Handle("/", tplHandler)
+
+ h := mux
+
+ // TODO logging
+ // TODO caching
+
+ return h, nil
+}