Skip to content
Snippets Groups Projects
main.go 1.65 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alex Ellis's avatar
    Alex Ellis committed
    package main
    
    import (
    
    	"bytes"
    
    Alex Ellis's avatar
    Alex Ellis committed
    	"io/ioutil"
    	"log"
    	"net/http"
    	"os"
    	"os/exec"
    	"strings"
    	"time"
    )
    
    
    // OsEnv implements interface to wrap os.Getenv
    type OsEnv struct {
    }
    
    // Getenv wraps os.Getenv
    func (OsEnv) Getenv(key string) string {
    	return os.Getenv(key)
    }
    
    Alex Ellis's avatar
    Alex Ellis committed
    
    
    func makeRequestHandler(config *WatchdogConfig) func(http.ResponseWriter, *http.Request) {
    	return func(w http.ResponseWriter, r *http.Request) {
    
    Alex Ellis's avatar
    Alex Ellis committed
    		if r.Method == "POST" {
    
    			parts := strings.Split(config.faasProcess, " ")
    
    Alex Ellis's avatar
    Alex Ellis committed
    			targetCmd := exec.Command(parts[0], parts[1:]...)
    			writer, _ := targetCmd.StdinPipe()
    
    Alex Ellis's avatar
    Alex Ellis committed
    			res, _ := ioutil.ReadAll(r.Body)
    
    			defer r.Body.Close()
    
    Alex Ellis's avatar
    Alex Ellis committed
    			writer.Write(res)
    			writer.Close()
    
    Alex Ellis's avatar
    Alex Ellis committed
    			if err != nil {
    
    				if config.writeDebug == true {
    
    				w.WriteHeader(500)
    				response := bytes.NewBufferString(err.Error())
    				w.Write(response.Bytes())
    				return
    
    Alex Ellis's avatar
    Alex Ellis committed
    			}
    
    			if config.writeDebug == true {
    
    Alex's avatar
    Alex committed
    
    			w.WriteHeader(200)
    
    Alex Ellis's avatar
    Alex Ellis committed
    			w.Write(out)
    
    Alex's avatar
    Alex committed
    		} else {
    			w.WriteHeader(http.StatusMethodNotAllowed)
    
    Alex Ellis's avatar
    Alex Ellis committed
    		}
    
    	}
    }
    
    func main() {
    	osEnv := OsEnv{}
    	readConfig := ReadConfig{}
    	config := readConfig.Read(osEnv)
    
    	if len(config.faasProcess) == 0 {
    		log.Panicln("Provide a valid process via fprocess environmental variable.")
    		return
    	}
    
    	readTimeout := time.Duration(config.readTimeout) * time.Second
    	writeTimeout := time.Duration(config.writeTimeout) * time.Second
    
    	s := &http.Server{
    		Addr:           ":8080",
    		ReadTimeout:    readTimeout,
    		WriteTimeout:   writeTimeout,
    		MaxHeaderBytes: 1 << 20,
    	}
    
    	http.HandleFunc("/", makeRequestHandler(&config))
    
    Alex Ellis's avatar
    Alex Ellis committed
    
    	log.Fatal(s.ListenAndServe())
    }