[PATCH] Add option to serve FCGI requests
Export this patch
---
cmd/alps/main.go | 10 +++++++--
server.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/cmd/alps/main.go b/cmd/alps/main.go
index 5a00957..6f682ba 100644
--- a/cmd/alps/main.go
+++ b/cmd/alps/main.go
@@ -76,7 +76,10 @@ func main() {
e.Logger.SetLevel(log.DEBUG)
}
- go e.Start(addr)
+ err = s.Start(addr)
+ if err != nil {
+ e.Logger.Fatal(err)
+ }
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGUSR1, syscall.SIGINT)
@@ -93,7 +96,10 @@ func main() {
ctx, cancel := context.WithDeadline(context.Background(),
time.Now().Add(30*time.Second))
- e.Shutdown(ctx)
+ err = s.Shutdown(ctx)
+ if err != nil {
+ e.Logger.Errorf("Failed to shutdown server: %v", err)
+ }
cancel()
s.Close()
diff --git a/server.go b/server.go
index f3429e8..09d9b16 100644
--- a/server.go
+++ b/server.go
@@ -1,11 +1,17 @@
package alps
import (
+ "context"
"encoding/json"
+ "errors"
"fmt"
+ "io/fs"
"log"
+ "net"
"net/http"
+ "net/http/fcgi"
"net/url"
+ "os"
"strings"
"sync"
"time"
@@ -24,6 +30,7 @@ type Server struct {
e *echo.Echo
Sessions *SessionManager
Options *Options
+ l net.Listener
mutex sync.RWMutex // used for server reload
plugins []Plugin
@@ -69,6 +76,55 @@ func newServer(e *echo.Echo, options *Options) (*Server, error) {
return s, nil
}
+func (s *Server) Start(addr string) error {
+ if strings.HasPrefix(addr, "fcgi+unix://") {
+ addr = strings.TrimPrefix(addr, "fcgi+unix://")
+ err := os.Remove(addr)
+ if err != nil && !errors.Is(err, fs.ErrNotExist) {
+ return err
+ }
+ a, err := net.ResolveUnixAddr("unix", addr)
+ if err != nil {
+ return err
+ }
+ s.l, err = net.ListenUnix("unix", a)
+ if err != nil {
+ return err
+ }
+ err = os.Chmod(addr, 0o666)
+ if err != nil {
+ return err
+ }
+ go fcgi.Serve(s.l, s.e)
+ s.e.Logger.Printf("fcgi server started on %v", a)
+ return nil
+ } else if strings.HasPrefix(addr, "fcgi://") {
+ addr = strings.TrimPrefix(addr, "fcgi://")
+ a, err := net.ResolveTCPAddr("tcp", addr)
+ if err != nil {
+ return err
+ }
+ s.l, err = net.ListenTCP("tcp", a)
+ if err != nil {
+ return err
+ }
+ go fcgi.Serve(s.l, s.e)
+ s.e.Logger.Printf("fcgi server started on %v", a)
+ return nil
+ }
+
+ go s.e.Start(addr)
+ return nil
+}
+
+func (s *Server) Shutdown(ctx context.Context) error {
+ if s.l != nil {
+ return s.l.Close()
+ }
+
+ return s.e.Shutdown(ctx)
+}
+
func (s *Server) Close() {
s.Sessions.Close()
}
--
2.30.2