func addFrameHandlers(mygdb *gdblib.GDB) { http.HandleFunc("/handle/frame/stackinfo", wrapHandlerFunc(func(w http.ResponseWriter, r *http.Request) { result, err := mygdb.StackInfoFrame() if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) return } resultBytes, err := json.Marshal(result) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } else { w.WriteHeader(200) w.Write(resultBytes) } })) http.HandleFunc("/handle/frame/stacklist", wrapHandlerFunc(func(w http.ResponseWriter, r *http.Request) { parms := gdblib.StackListFramesParms{} decoder := json.NewDecoder(r.Body) err := decoder.Decode(&parms) if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) return } result, err := mygdb.StackListFrames(parms) if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) return } resultBytes, err := json.Marshal(result) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } else { w.WriteHeader(200) w.Write(resultBytes) } })) http.HandleFunc("/handle/frame/variableslist", wrapHandlerFunc(func(w http.ResponseWriter, r *http.Request) { parms := gdblib.StackListVariablesParms{} decoder := json.NewDecoder(r.Body) err := decoder.Decode(&parms) if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) return } result, err := mygdb.StackListVariables(parms) if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) return } resultBytes, err := json.Marshal(result) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } else { w.WriteHeader(200) w.Write(resultBytes) } })) http.HandleFunc("/handle/file/get", wrapHandlerFunc(func(w http.ResponseWriter, r *http.Request) { parms := make(map[string]string) decoder := json.NewDecoder(r.Body) err := decoder.Decode(&parms) if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) return } path := parms["File"] if path == "" { w.WriteHeader(400) w.Write([]byte("No path provided")) return } path, err = filepath.Abs(path) inGopath := false for _, p := range gopaths { if strings.HasPrefix(path, p) { inGopath = true break } } // If the path is not under the current directory or in the GOPATH/GOROOT then it is an illegal access if !inGopath && !strings.HasPrefix(path, cwd) && !strings.HasPrefix(path, goroot) { w.WriteHeader(400) w.Write([]byte("Illegal file access")) return } file, err := os.Open(path) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } else { w.WriteHeader(200) _, err := io.Copy(w, file) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } } })) }