flowserver.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package flowserver
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "net/http"
  7. "net/http/httputil"
  8. "net/url"
  9. "os"
  10. "github.com/gohxs/prettylog"
  11. "github.com/gohxs/webu"
  12. "github.com/gohxs/webu/chain"
  13. )
  14. //go:generate go get github.com/gohxs/genversion
  15. //go:generate genversion -package flowserver -out version.go
  16. //
  17. // FlowServer structure
  18. type FlowServer struct{}
  19. // ListenAndServe starts the httpserver
  20. // It will listen on default port 2015 and increase if port is in use
  21. func (f *FlowServer) ListenAndServe() error {
  22. fsm := NewFlowSessionManager()
  23. c := chain.New(webu.ChainLogger(prettylog.New("req")))
  24. mux := http.NewServeMux()
  25. mux.Handle("/conn", c.Build(fsm.ServeHTTP))
  26. if os.Getenv("DEBUG") == "1" {
  27. log.Println("DEBUG MODE: reverse proxy localhost:8081")
  28. proxyURL, err := url.Parse("http://localhost:8081")
  29. if err != nil {
  30. return err
  31. }
  32. mux.Handle("/", c.Build(httputil.NewSingleHostReverseProxy(proxyURL).ServeHTTP))
  33. } else {
  34. mux.Handle("/", c.Build(webu.StaticHandler("web", "index.html")))
  35. }
  36. ////////////////////
  37. // Server starter
  38. /////
  39. port := 2015
  40. for {
  41. addr := fmt.Sprintf(":%d", port)
  42. s, err := net.Listen("tcp", addr)
  43. if err != nil {
  44. log.Println("Listen error:", err)
  45. port++
  46. continue
  47. }
  48. log.Println("Listening at:", addr)
  49. err = http.Serve(s, mux)
  50. if err != nil {
  51. log.Fatal(err)
  52. }
  53. }
  54. }