diff options
author | EUcancER <root@euer.krebsco.de> | 2011-09-15 02:02:34 +0200 |
---|---|---|
committer | EUcancER <root@euer.krebsco.de> | 2011-09-15 02:02:34 +0200 |
commit | 095b22ab0c4b8ca7c6f33af2d1f75d3d82055455 (patch) | |
tree | a34afa0947b668fce2dc2b39fa1cfeac03386659 /hyper/process/main.go | |
parent | 88517b3edfc7b633d210422afb8579e5d0d3d1e0 (diff) | |
parent | 90be8b346c43da2b36c0b4872fcf1190cfaeaa85 (diff) |
Merge branch 'master' of github.com:krebscode/painload
Diffstat (limited to 'hyper/process/main.go')
-rw-r--r-- | hyper/process/main.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/hyper/process/main.go b/hyper/process/main.go new file mode 100644 index 00000000..5420f681 --- /dev/null +++ b/hyper/process/main.go @@ -0,0 +1,77 @@ +package main + +import "json" +import "log" +import "http" +import "gorilla.googlecode.com/hg/gorilla/mux" +import "os" +import "fmt" +import "bytes" + +import "hyper/process" + +var proc = map[string] *hyper.Process{} + +// TODO Retrieve Process, Write, Kill [autokill], get exit code + +func RespondJSON(res http.ResponseWriter, v interface{}) os.Error { + content, err := json.Marshal(v) + if err == nil { + log.Printf("< %s", content) + res.Header().Set("Content-Type", "application/json; charset=\"utf-8\"") + res.WriteHeader(http.StatusOK) + res.Write(content) + } else { + log.Printf("%s while json.Marshal(%s)", err, v) + } + return err +} + +func CreateProcessHandler(res http.ResponseWriter, req *http.Request) { + if p, err := hyper.NewProcess(req); err == nil { + id := p.Id() + proc[id] = p + RespondJSON(res, &map[string]string{ + "path": fmt.Sprintf("/proc/%s", id), + }) + } else { + log.Printf("%s", err) + res.WriteHeader(http.StatusInternalServerError) + } +} + +func RetrieveProcess(res http.ResponseWriter, req *http.Request) { + if p := proc[mux.Vars(req)["id"]]; p != nil { + RespondJSON(res, p) + } else { + res.WriteHeader(http.StatusNotFound) + } +} + +func FeedProcess(res http.ResponseWriter, req *http.Request) { + if p := proc[mux.Vars(req)["id"]]; p != nil { + body := make([]byte, 4096) + if _, err := req.Body.Read(body); err == nil { + body = bytes.TrimRight(body, string([]byte{0})) + p.Write(body) + //if err := p.Write(body); err == nil { + RespondJSON(res, true) + //} + } + } else { + res.WriteHeader(http.StatusNotFound) + } +} + +func main() { + + // Gorilla + mux.HandleFunc("/proc", CreateProcessHandler).Methods("POST") + mux.HandleFunc("/proc/{id}", RetrieveProcess).Methods("GET") + mux.HandleFunc("/proc/{id}", FeedProcess).Methods("POST") + + err := http.ListenAndServe("0.0.0.0:8888", mux.DefaultRouter) + if err != nil { + log.Fatal("ListenAndServe: ", err.String()) + } +} |