package main import ( "fmt" "net/http" "net/http/fcgi" "net" "encoding/json" "strings" "runtime" ) type fcgiHandlerFunc func(http.ResponseWriter, *http.Request) type fcgiHandlers map[string] fcgiHandlerFunc type fcgiHandlerMain struct { handlers fcgiHandlers } func (f fcgiHandlerMain) ServeHTTP(w http.ResponseWriter, req *http.Request) { s := strings.Split(req.URL.Path, "/") funcname := s[len(s)-1] if fhandler, ok := f.handlers[funcname]; ok { fhandler(w, req) } else { fmt.Println("Unrecognised function requested", funcname) w.WriteHeader(400); w.Write([]byte("Invalid request")); } } func testHandler(w http.ResponseWriter, req *http.Request) { if req.Method != "POST" { w.WriteHeader(400) w.Write([]byte("Invalid request")) return } buffer := make([]byte, req.ContentLength) if _, err := req.Body.Read(buffer); err != nil { w.WriteHeader(400) w.Write([]byte("Invalid request")) return } var inputStruct struct { Id int `json:"id"` }; if json.Unmarshal(buffer, &inputStruct) != nil { w.WriteHeader(400) w.Write([]byte("Invalid request")) return } b := []byte(`123456789123456789123456789123456789123456789`) w.Write(b) } func main() { // Using multiprocs causes fcgi connection reset runtime.GOMAXPROCS(2) var handlers fcgiHandlers handlers = make(fcgiHandlers) // Register all API handlers here handlers["test"] = testHandler l, err := net.Listen("tcp", "127.0.0.1:19111") if err != nil { fmt.Println(err) return } b := new(fcgiHandlerMain) b.handlers = handlers fcgi.Serve(l, b) }