39 lines
1002 B
Go
39 lines
1002 B
Go
// Copyright (c) 2025 Toni Spets
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package exhttp
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"syscall"
|
|
|
|
"golang.org/x/net/http2"
|
|
)
|
|
|
|
func IsNetworkError(err error) bool {
|
|
if errno := syscall.Errno(0); errors.As(err, &errno) {
|
|
// common errnos for network related operations
|
|
return errno == syscall.ENETDOWN ||
|
|
errno == syscall.ENETUNREACH ||
|
|
errno == syscall.ENETRESET ||
|
|
errno == syscall.ECONNABORTED ||
|
|
errno == syscall.ECONNRESET ||
|
|
errno == syscall.ENOBUFS ||
|
|
errno == syscall.ETIMEDOUT ||
|
|
errno == syscall.ECONNREFUSED ||
|
|
errno == syscall.EHOSTDOWN ||
|
|
errno == syscall.EHOSTUNREACH ||
|
|
errno == syscall.EPIPE
|
|
} else if netError := net.Error(nil); errors.As(err, &netError) {
|
|
return true
|
|
} else if errors.As(err, &http2.StreamError{}) {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|