~migadu/alps-devel

Add option to serve FCGI requests v1 PROPOSED

Igor Zornik: 1
 Add option to serve FCGI requests

 2 files changed, 64 insertions(+), 2 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~migadu/alps-devel/patches/45711/mbox | git am -3
Learn more about email & git

[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