diff --git a/gopoc/.gitignore b/gopoc/poc1/.gitignore similarity index 100% rename from gopoc/.gitignore rename to gopoc/poc1/.gitignore diff --git a/gopoc/Makefile b/gopoc/poc1/Makefile similarity index 100% rename from gopoc/Makefile rename to gopoc/poc1/Makefile diff --git a/gopoc/go.mod b/gopoc/poc1/go.mod similarity index 100% rename from gopoc/go.mod rename to gopoc/poc1/go.mod diff --git a/gopoc/kapow.go b/gopoc/poc1/kapow.go similarity index 100% rename from gopoc/kapow.go rename to gopoc/poc1/kapow.go diff --git a/gopoc/poc2/.gitignore b/gopoc/poc2/.gitignore new file mode 100644 index 0000000..735e9fe --- /dev/null +++ b/gopoc/poc2/.gitignore @@ -0,0 +1 @@ +kapow diff --git a/gopoc/poc2/kapow.go b/gopoc/poc2/kapow.go new file mode 100644 index 0000000..bba1839 --- /dev/null +++ b/gopoc/poc2/kapow.go @@ -0,0 +1,82 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os/exec" +) + +const defaultMessage = "Hello Mr. %v\n" +const commandErrorMessage = "Error executing command: %v\n" +const commandExecutionMessage = "Command executed: %v\n" + +type serverSpec struct { + id, listenAddr string + routes *http.ServeMux +} + +var servers = []serverSpec{{id: "commandServer", listenAddr: ":8090"}, {id: "defaultServer", listenAddr: ":8080"}} + +func startServer(spec serverSpec) { + err := http.ListenAndServe(spec.listenAddr, spec.routes) + if err != nil { + log.Fatal("Error serving ", err) + } +} + +func main() { + + pipe := make(chan string) + + // Create default route handler + servers[1].routes = http.NewServeMux() + servers[1].routes.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/speech; charset=utf-8") + w.WriteHeader(http.StatusOK) + w.Write([]byte(fmt.Sprintf(defaultMessage, "Unknown"))) + + pipe <- fmt.Sprintf("Received request on server %v", servers[1].id) + servers[0].routes.HandleFunc("/testNewRoute", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/speech; charset=utf-8") + + cmd := exec.Command("ls", "-la", "../") + output, err := cmd.CombinedOutput() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf(commandErrorMessage, err))) + } else { + w.WriteHeader(http.StatusOK) + w.Write([]byte(fmt.Sprintf(commandExecutionMessage, string(output)))) + } + + pipe <- fmt.Sprintf("Received request \"/\" on server %v", servers[0].id) + }) + }) + + // Create commands route handler + servers[0].routes = http.NewServeMux() + servers[0].routes.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/speech; charset=utf-8") + + cmd := exec.Command("ls", "-la", "./") + output, err := cmd.CombinedOutput() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf(commandErrorMessage, err))) + } else { + w.WriteHeader(http.StatusOK) + w.Write([]byte(fmt.Sprintf(commandExecutionMessage, string(output)))) + } + + pipe <- fmt.Sprintf("Received request \"/testNewRoute\" on server %v", servers[0].id) + }) + + for i := 0; i < len(servers); i++ { + go startServer(servers[i]) + } + + for { + fmt.Println("Tracing: ", <-pipe) + } +}