@@ -8,24 +8,14 @@ import (
88 "net"
99 "net/http"
1010 "os"
11− "strconv"
1211 "strings"
1312 "time"
1413
15− "github.com/coreos/go-systemd/activation"
14+ "golang.org/x/sync/errgroup"
15+
1616 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
1717 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options/util"
1818 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
19− "golang.org/x/sync/errgroup"
20−)
21−
22−// listenFdsStart corresponds to `SD_LISTEN_FDS_START`.
23−// Since the 3 first file descriptors in every linux process is
24−// stdin, stdout and stderr. The first usable file descriptor is 3.
25−// systemd-socket-activate will always assume that the first socket will be
26−// 3 and the rest follow.
27−const (
28− listenFdsStart = 3
2919)
3020
3121// Server represents an HTTP or HTTPS server.
@@ -83,27 +73,6 @@ type server struct {
8373 fdFiles []*os.File
8474}
8575
86−// convert a string filedescriptor to an actual listener
87−func (s *server) fdToListener(bindAddress string) (net.Listener, error) {
88− fd, err := strconv.Atoi(bindAddress)
89− if err != nil {
90− return nil, fmt.Errorf("listen failed: fd with name is not implemented yet")
91− }
92− fdIndex := fd - listenFdsStart
93−
94− if len(s.fdFiles) == 0 {
95− s.fdFiles = activation.Files(true)
96− }
97−
98− l := len(s.fdFiles)
99−
100− if fdIndex < 0 || fdIndex >= l || l == 0 {
101− return nil, fmt.Errorf("listen failed: fd outside of range of available file descriptors")
102− }
103−
104− return net.FileListener(s.fdFiles[fdIndex])
105−}
106−
10776// setupListener sets the server listener if the HTTP server is enabled.
10877// The HTTP server can be disabled by setting the BindAddress to "-" or by
10978// leaving it empty.
@@ -120,13 +89,7 @@ func (s *server) setupListener(opts Opts) error {
12089 // to the program is indeed a net.Listener and starts using it
12190 // without setting up a new listener.
12291 if strings.HasPrefix(strings.ToLower(opts.BindAddress), "fd:") {
123− listenAddr := opts.BindAddress[3:]
124− listener, err := s.fdToListener(listenAddr)
125− if err != nil {
126− err = fmt.Errorf("listen (%s, %s) failed: %v", "file", listenAddr, err)
127− }
128− s.listener = listener
129− return err
92+ return s.checkSystemdSocketSupport(opts)
13093 }
13194
13295 networkType := getNetworkScheme(opts.BindAddress)
@@ -134,7 +97,7 @@ func (s *server) setupListener(opts Opts) error {
13497
13598 listener, err := net.Listen(networkType, listenAddr)
13699 if err != nil {
137− return fmt.Errorf("listen (%s, %s) failed: %v", networkType, listenAddr, err)
100+ return fmt.Errorf("listen (%s, %s) failed: %w", networkType, listenAddr, err)
138101 }
139102 s.listener = listener
140103