1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package main
import ( "io" "net/http" "os/exec" )
var ( BUF_LEN = 1024 )
func handler(w http.ResponseWriter, r *http.Request) { cmd := exec.Command("./build.sh") pipeReader, pipeWriter := io.Pipe() cmd.Stdout = pipeWriter cmd.Stderr = pipeWriter go writeCmdOutput(w, pipeReader) cmd.Run() pipeWriter.Close() }
func writeCmdOutput(res http.ResponseWriter, pipeReader *io.PipeReader) { buffer := make([]byte, BUF_LEN) for { n, err := pipeReader.Read(buffer) if err != nil { pipeReader.Close() break }
data := buffer[0:n] res.Write(data) if f, ok := res.(http.Flusher); ok { f.Flush() } for i := 0; i < n; i++ { buffer[i] = 0 } } }
func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
|