func New(ctl *ui.Controller, state ui.State) *TermView { // initialize terminal display termbox.Init() // make sure ngrok doesn't quit until we've cleaned up ctl.Wait.Add(1) w, _ := termbox.Size() v := &TermView{ ctl: ctl, updates: ctl.Updates.Reg(), flush: make(chan int), subviews: make([]ui.View, 0), state: state, Logger: log.NewPrefixLogger(), area: NewArea(0, 0, w, 10), } v.Logger.AddLogPrefix("view") v.Logger.AddLogPrefix("term") switch p := state.GetProtocol().(type) { case *proto.Http: v.subviews = append(v.subviews, NewHttp(p, v.flush, ctl.Shutdown, 0, 10)) default: } v.Render() go v.run() go v.input() return v }
func NewWebView(ctl *ui.Controller, state ui.State, port int) *WebView { w := &WebView{} switch p := state.GetProtocol().(type) { case *proto.Http: NewWebHttpView(ctl, p) } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/http/in", 302) }) http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) { parts := strings.Split(r.URL.Path, "/") name := parts[len(parts)-1] fn, ok := static.AssetMap[name] if !ok { http.NotFound(w, r) return } w.Write(fn()) }) log.Info("Serving web interface on localhost:%d", port) go http.ListenAndServe(fmt.Sprintf(":%d", port), nil) return w }
func NewWebView(ctl *ui.Controller, state ui.State, port int) *WebView { v := &WebView{ wsMessages: util.NewBroadcast(), } switch p := state.GetProtocol().(type) { case *proto.Http: NewWebHttpView(v, ctl, p) } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/http/in", 302) }) http.HandleFunc("/_ws", func(w http.ResponseWriter, r *http.Request) { conn, err := websocket.Upgrade(w, r.Header, nil, 1024, 1024) if err != nil { http.Error(w, "Failed websocket upgrade", 400) log.Warn("Failed websocket upgrade: %v", err) return } msgs := v.wsMessages.Reg() defer v.wsMessages.UnReg(msgs) for m := range msgs { err := conn.WriteMessage(websocket.OpText, m.([]byte)) if err != nil { // connection is closed break } } }) http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) { parts := strings.Split(r.URL.Path, "/") name := parts[len(parts)-1] fn, ok := static.AssetMap[name] if !ok { http.NotFound(w, r) return } w.Write(fn()) }) log.Info("Serving web interface on localhost:%d", port) go http.ListenAndServe(fmt.Sprintf(":%d", port), nil) return v }