@marcel91200 / caddy Mirror · read-only / commits / b3f7ce34
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 13, 23:00 UTC

More explanatory error message from Listen (#4534)

* explain cryptic unix socket listener error related to process kill https://github.com/caddyserver/caddy/pull/4533 * less ambiguous wording: clean up -> delete * shorten error message explanation * link back to pull request in comment for later archeaology

Forest Johnson committed Jan 19, 2022 at 19:26 UTC b3f7ce34b4209c13186c8c9626ffb9316fb5603a
1 file changed +23
listeners.go
+23
@@ -17,6 +17,7 @@ package caddy
17 import (
18 "fmt"
19 "net"
20 + "os"
21 "strconv"
22 "strings"
23 "sync"
@@ -39,6 +40,10 @@ func Listen(network, addr string) (net.Listener, error) {
40 sharedLn, _, err := listenerPool.LoadOrNew(lnKey, func() (Destructor, error) {
41 ln, err := net.Listen(network, addr)
42 if err != nil {
43 + // https://github.com/caddyserver/caddy/pull/4534
44 + if isUnixNetwork(network) && isListenBindAddressAlreadyInUseError(err) {
45 + return nil, fmt.Errorf("%w: this can happen if Caddy was forcefully killed", err)
46 + }
47 return nil, err
48 }
49 return &sharedListener{Listener: ln, key: lnKey}, nil
@@ -59,6 +64,10 @@ func ListenPacket(network, addr string) (net.PacketConn, error) {
64 sharedPc, _, err := listenerPool.LoadOrNew(lnKey, func() (Destructor, error) {
65 pc, err := net.ListenPacket(network, addr)
66 if err != nil {
67 + // https://github.com/caddyserver/caddy/pull/4534
68 + if isUnixNetwork(network) && isListenBindAddressAlreadyInUseError(err) {
69 + return nil, fmt.Errorf("%w: this can happen if Caddy was forcefully killed", err)
70 + }
71 return nil, err
72 }
73 return &sharedPacketConn{PacketConn: pc, key: lnKey}, nil
@@ -322,6 +331,20 @@ func isUnixNetwork(netw string) bool {
331 return netw == "unix" || netw == "unixgram" || netw == "unixpacket"
332 }
333
334 +func isListenBindAddressAlreadyInUseError(err error) bool {
335 + switch networkOperationError := err.(type) {
336 + case *net.OpError:
337 + switch syscallError := networkOperationError.Err.(type) {
338 + case *os.SyscallError:
339 + if syscallError.Syscall == "bind" {
340 + return true
341 + }
342 + }
343 + }
344 +
345 + return false
346 +}
347 +
348 // ParseNetworkAddress parses addr into its individual
349 // components. The input string is expected to be of
350 // the form "network/host:port-range" where any part is