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