-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
51 lines (44 loc) · 1.22 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package geminis
import (
"context"
"os"
"strings"
"time"
"git.sr.ht/~adnano/go-gemini"
"git.sr.ht/~adnano/go-gemini/certificate"
"github.com/mplewis/gemocities/content"
"github.com/mplewis/gemocities/mail"
"github.com/mplewis/gemocities/user"
)
type ServerArgs struct {
UserManager *user.Manager
ContentManager *content.Manager
Mailer mail.IMailer
GeminiCertsDir string
ContentDir string
GeminiHost string
}
func BuildServer(args ServerArgs) (*gemini.Server, error) {
certificates := &certificate.Store{}
certificates.Register("localhost")
if err := certificates.Load(args.GeminiCertsDir); err != nil {
return nil, err
}
fs := gemini.FileServer(os.DirFS(args.ContentDir))
rt := buildRouter(args.UserManager, args.ContentManager, args.Mailer)
handler := gemini.HandlerFunc(func(ctx context.Context, w gemini.ResponseWriter, r *gemini.Request) {
if strings.HasPrefix(r.URL.Path, "/~") {
fs.ServeGemini(ctx, w, r)
return
}
rt.ServeGemini(ctx, w, r)
})
srv := &gemini.Server{
Handler: LoggingMiddleware(handler),
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
GetCertificate: certificates.Get,
Addr: args.GeminiHost,
}
return srv, nil
}