github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/uiproto/uiproto.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "net" 8 "net/http" 9 "path" 10 "sync" 11 12 "github.com/gocaveman/caveman/uiproto/files" 13 ) 14 15 func main() { 16 17 flag.Parse() 18 19 // ln, err := net.Listen("tcp", "127.0.0.1:0") 20 ln, err := net.Listen("tcp", "127.0.0.1:5561") 21 if err != nil { 22 log.Fatal(err) 23 } 24 25 _, port, err := net.SplitHostPort(ln.Addr().String()) 26 if err != nil { 27 log.Fatal(err) 28 } 29 30 s := &http.Server{ 31 Handler: &MainHandler{}, 32 } 33 var wg sync.WaitGroup 34 wg.Add(1) 35 go func() { 36 defer wg.Done() 37 err := s.Serve(ln) 38 if err != nil { 39 log.Printf("Error from HTTP server: %v", err) 40 } 41 }() 42 43 mainURL := fmt.Sprintf("http://127.0.0.1:%s/index.html", port) 44 log.Printf("Main URL: %s", mainURL) 45 46 wg.Wait() 47 48 } 49 50 type MainHandler struct{} 51 52 func (ws *MainHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 53 54 fpath := path.Join("/static", path.Clean("/"+r.URL.Path)) 55 56 f, err := files.EmbeddedAssets.Open(fpath) 57 if err != nil { 58 log.Print(err) 59 http.Error(w, err.Error(), 500) 60 return 61 } 62 defer f.Close() 63 fst, err := f.Stat() 64 if err != nil { 65 log.Print(err) 66 http.Error(w, err.Error(), 500) 67 return 68 } 69 70 http.ServeContent(w, r, path.Base(fpath), fst.ModTime(), f) 71 72 }