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  }