cmd/shrt/internal/serve/serve.go in go-shrt

at v0.4.1

1// See LICENSE file for copyright and license details
2
3// Package serve implements the "shrt serve" command
4package serve
5
6import (
7 "context"
8 "io/fs"
9 "log"
10 "net"
11 "net/http"
12 "net/url"
13 "os"
14
15 "djmo.ch/go-shrt"
16 "djmo.ch/go-shrt/cmd/shrt/internal/base"
17)
18
19var (
20 hangup func(*shrt.ShrtHandler)
21 lockdown func(string)
22)
23
24var Cmd = &base.Command{
25 Run: runServe,
26 Name: "serve",
27 Usage: "shrt serve URL",
28 ShortHelp: "serve requests",
29 LongHelp: `Serve serves HTTP requests.
30
31Shrt listens and serves shortlinks and go-get requests on the provided
32URL. The only recognized scheme is http.
33 `,
34}
35
36func runServe(ctx context.Context) {
37 log.SetFlags(log.LstdFlags)
38 log.SetPrefix("")
39 var (
40 args = ctx.Value("args").([]string)
41 cfg = ctx.Value("cfg").(shrt.Config)
42 )
43 if len(args) != 1 {
44 log.Fatal("no URL provided")
45 }
46 u, err := url.Parse(args[0])
47 if err != nil {
48 log.Fatal("failed to parse URL: ", err)
49 }
50
51 shrtfile := shrt.NewShrtFile()
52 fsys := os.DirFS("/").(fs.StatFS)
53 f, err := fsys.Open(cfg.DbPath)
54 if err != nil {
55 log.Println("fs error:", err)
56 os.Exit(1)
57 }
58 err = shrtfile.ReadShrtFile(f)
59 if err != nil {
60 log.Println("db error:", err)
61 os.Exit(1)
62 }
63 h := &shrt.ShrtHandler{Config: cfg, ShrtFile: shrtfile, FS: fsys}
64 if hangup != nil {
65 go hangup(h)
66 }
67 if lockdown != nil {
68 lockdown(cfg.DbPath)
69 }
70 switch u.Scheme {
71 case "http":
72 listener, err := net.Listen("tcp", u.Host)
73 if err != nil {
74 log.Fatal("listen: ", err)
75 }
76 log.Fatal(http.Serve(listener, h))
77 default:
78 log.Fatal("unknown scheme:", u.Scheme)
79 }
80}