Skip to content

Commit b55da1d

Browse files
committed
exhttp: Add IsNetworkError helper
1 parent fc01e95 commit b55da1d

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed

exhttp/networkerror.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright (c) 2025 Tulir Asokan
2+
//
3+
// This Source Code Form is subject to the terms of the Mozilla Public
4+
// License, v. 2.0. If a copy of the MPL was not distributed with this
5+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
7+
package exhttp
8+
9+
import (
10+
"errors"
11+
"net"
12+
"syscall"
13+
14+
"golang.org/x/net/http2"
15+
)
16+
17+
func IsNetworkError(err error) bool {
18+
for err != nil {
19+
if _, ok := err.(net.Error); ok {
20+
return true
21+
} else if _, ok := err.(*net.OpError); ok {
22+
return true
23+
} else if errno, ok := err.(syscall.Errno); ok {
24+
// common errnos for network related operations
25+
return errno == syscall.ENETDOWN ||
26+
errno == syscall.ENETUNREACH ||
27+
errno == syscall.ENETRESET ||
28+
errno == syscall.ECONNABORTED ||
29+
errno == syscall.ECONNRESET ||
30+
errno == syscall.ENOBUFS ||
31+
errno == syscall.ETIMEDOUT ||
32+
errno == syscall.ECONNREFUSED ||
33+
errno == syscall.EHOSTDOWN ||
34+
errno == syscall.EHOSTUNREACH
35+
} else if errors.As(err, &http2.StreamError{}); ok {
36+
return true
37+
}
38+
39+
err = errors.Unwrap(err)
40+
}
41+
42+
return false
43+
}

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ require (
1111
github.com/rs/zerolog v1.33.0
1212
github.com/stretchr/testify v1.10.0
1313
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394
14-
golang.org/x/sys v0.31.0
15-
golang.org/x/text v0.23.0
14+
golang.org/x/net v0.40.0
15+
golang.org/x/sys v0.33.0
16+
golang.org/x/text v0.25.0
1617
google.golang.org/protobuf v1.36.5
1718
gopkg.in/yaml.v3 v3.0.1
1819
)

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
2828
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
2929
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
3030
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
31+
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
32+
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
3133
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3234
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3335
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
34-
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
35-
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
36-
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
37-
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
36+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
37+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
38+
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
39+
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
3840
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
3941
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
4042
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

0 commit comments

Comments
 (0)