@@ -12,6 +12,7 @@ import (
1212 "strings"
1313 "time"
1414
15+ "github.com/coreos/go-systemd/v22/activation"
1516 "golang.org/x/crypto/acme"
1617 "golang.org/x/crypto/acme/autocert"
1718 "golang.org/x/crypto/bcrypt"
@@ -75,7 +76,7 @@ type CLIArgs struct {
7576
7677func parse_args () CLIArgs {
7778 var args CLIArgs
78- flag .StringVar (& args .bind_address , "bind-address" , ":8080" , "HTTP proxy listen address" )
79+ flag .StringVar (& args .bind_address , "bind-address" , ":8080" , "HTTP proxy listen address. Set empty value to use systemd socket activation. " )
7980 flag .StringVar (& args .auth , "auth" , "none://" , "auth parameters" )
8081 flag .IntVar (& args .verbosity , "verbosity" , 20 , "logging verbosity " +
8182 "(10 - debug, 20 - info, 30 - warning, 40 - error, 50 - critical)" )
@@ -170,14 +171,40 @@ func run() int {
170171 }
171172
172173 mainLogger .Info ("Starting proxy server..." )
174+ var listener net.Listener
175+ if args .bind_address == "" {
176+ // socket activation
177+ listeners , err := activation .Listeners ()
178+ if err != nil {
179+ mainLogger .Critical ("socket activation failed: %v" , err )
180+ return 3
181+ }
182+ if len (listeners ) != 1 {
183+ mainLogger .Critical ("socket activation failed: unexpected number of listeners: %d" ,
184+ len (listeners ))
185+ return 3
186+ }
187+ if listeners [0 ] == nil {
188+ mainLogger .Critical ("socket activation failed: nil listener returned" )
189+ return 3
190+ }
191+ listener = listeners [0 ]
192+ } else {
193+ newListener , err := net .Listen ("tcp" , args .bind_address )
194+ if err != nil {
195+ mainLogger .Critical ("listen failed: %v" , err )
196+ return 3
197+ }
198+ listener = newListener
199+ }
200+
173201 if args .cert != "" {
174- cfg , err1 := makeServerTLSConfig (args .cert , args .key , args .cafile , args .ciphers )
202+ cfg , err1 := makeServerTLSConfig (args .cert , args .key , args .cafile , args .ciphers , ! args . disableHTTP2 )
175203 if err1 != nil {
176204 mainLogger .Critical ("TLS config construction failed: %v" , err1 )
177205 return 3
178206 }
179- server .TLSConfig = cfg
180- err = server .ListenAndServeTLS ("" , "" )
207+ listener = tls .NewListener (listener , cfg )
181208 } else if args .autocert {
182209 m := & autocert.Manager {
183210 Cache : autocert .DirCache (args .autocertDir ),
@@ -195,18 +222,15 @@ func run() int {
195222 }()
196223 }
197224 cfg := m .TLSConfig ()
198- cfg , err = updateServerTLSConfig (cfg , args .cafile , args .ciphers )
225+ cfg , err = updateServerTLSConfig (cfg , args .cafile , args .ciphers , ! args . disableHTTP2 )
199226 if err != nil {
200227 mainLogger .Critical ("TLS config construction failed: %v" , err )
201228 return 3
202229 }
203- server .TLSConfig = cfg
204- err = server .ListenAndServeTLS ("" , "" )
205- mainLogger .Info ("Proxy server started." )
206- } else {
207- mainLogger .Info ("Proxy server started." )
208- err = server .ListenAndServe ()
230+ listener = tls .NewListener (listener , cfg )
209231 }
232+ mainLogger .Info ("Proxy server started." )
233+ err = server .Serve (listener )
210234 mainLogger .Critical ("Server terminated with a reason: %v" , err )
211235 mainLogger .Info ("Shutting down..." )
212236 return 0
0 commit comments