From 7878db5c95e5eb430b7b878fe6eb8084f15441a7 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Sat, 21 Jan 2023 16:01:52 +0100 Subject: Initial implementation of post rendering over gmi --- src/gmi/gmi.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'src/gmi/gmi.go') 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 +} -- cgit v1.2.3