package main import ( "archive/zip" "bytes" "fmt" "github.com/pkg/browser" "io/ioutil" "mime/multipart" "net/http" "path" "regexp" "time" ) type dataMap map[string]*bytes.Reader type zipContext struct { Data dataMap } func (z *zipContext) rootHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, index) } func (z *zipContext) uploadHandler(w http.ResponseWriter, r *http.Request) { r.ParseMultipartForm(32 << 20) file, _, err := r.FormFile("artifact") if err != nil { fmt.Println(err) return } if err := unzip(file, z.Data); err != nil { panic(err) } var vizpath string for k := range z.Data { r, err := regexp.MatchString("index.", k) if err == nil && r { vizpath = k } } http.Redirect(w, r, path.Join("tmp", vizpath), 301) } func (z *zipContext) ServeHTTP(w http.ResponseWriter, r *http.Request) { filename := r.URL.Path http.ServeContent(w, r, filename, time.Now(), z.Data[filename]) } func main() { zipServer := &zipContext{ Data: make(dataMap), } http.HandleFunc("/", zipServer.rootHandler) http.HandleFunc("/upload", zipServer.uploadHandler) http.Handle("/tmp/", http.StripPrefix("/tmp/", zipServer)) err := browser.OpenURL("http://localhost:8282") if err != nil { panic(err) } http.ListenAndServe(":8282", nil) } func unzip(source multipart.File, unzipped dataMap) error { var buff bytes.Buffer sourceSize, err := buff.ReadFrom(source) if err != nil { return err } r, err := zip.NewReader(source, sourceSize) if err != nil { return err } for _, f := range r.File { rc, err := f.Open() if err != nil { return err } b, err := ioutil.ReadAll(rc) if err != nil { return err } unzipped[f.Name] = bytes.NewReader(b) } return nil } var index = `