at v0.4.1
1 | // See LICENSE file for copyright and license details |
2 | |
3 | // Package serve implements the "shrt serve" command |
4 | package serve |
5 | |
6 | import ( |
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 | |
19 | var ( |
20 | hangup func(*shrt.ShrtHandler) |
21 | lockdown func(string) |
22 | ) |
23 | |
24 | var 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 | |
31 | Shrt listens and serves shortlinks and go-get requests on the provided |
32 | URL. The only recognized scheme is http. |
33 | `, |
34 | } |
35 | |
36 | func 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 | } |