Skip to content

Commit 128c423

Browse files
committed
Suppress broken-pipe and connection-reset errors on client disconnect
1 parent 393e9fa commit 128c423

4 files changed

Lines changed: 13 additions & 5 deletions

File tree

internal/feeds/handler.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"archded/internal/news"
1010
"archded/internal/packages"
1111
"archded/internal/releases"
12+
"archded/internal/ui/layout"
1213
)
1314

1415
const feedItems = 25
@@ -80,7 +81,7 @@ func writeAtom(w http.ResponseWriter, feed atomFeed) {
8081
_, _ = w.Write([]byte(xml.Header))
8182
enc := xml.NewEncoder(w)
8283
enc.Indent("", " ")
83-
if err := enc.Encode(feed); err != nil {
84+
if err := enc.Encode(feed); err != nil && !layout.IsClientDisconnect(err) {
8485
slog.Error("encode atom feed", "error", err)
8586
}
8687
}

internal/feeds/planet.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func (h *Handler) planetRSSFeed(w http.ResponseWriter, r *http.Request) {
131131
_, _ = w.Write([]byte(xml.Header))
132132
enc := xml.NewEncoder(w)
133133
enc.Indent("", " ")
134-
if err := enc.Encode(feed); err != nil {
134+
if err := enc.Encode(feed); err != nil && !layout.IsClientDisconnect(err) {
135135
slog.Error("encode planet rss feed", "error", err)
136136
}
137137
}

internal/sitemap/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func (h *Handler) index(w http.ResponseWriter, r *http.Request) {
8888
if err := enc.Encode(urlSet{
8989
XMLNS: "http://www.sitemaps.org/schemas/sitemap/0.9",
9090
URLs: urls,
91-
}); err != nil {
91+
}); err != nil && !layout.IsClientDisconnect(err) {
9292
slog.Error("encode sitemap", "error", err)
9393
}
9494
}

internal/ui/layout/render.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,17 @@ import (
55
"errors"
66
"log/slog"
77
"net/http"
8+
"syscall"
89

910
"github.com/a-h/templ"
1011
)
1112

13+
func IsClientDisconnect(err error) bool {
14+
return errors.Is(err, context.Canceled) ||
15+
errors.Is(err, syscall.EPIPE) ||
16+
errors.Is(err, syscall.ECONNRESET)
17+
}
18+
1219
func Render(w http.ResponseWriter, r *http.Request, page Page, content templ.Component) {
1320
if !page.NoIndex {
1421
canonicalPath := page.CanonicalPath
@@ -24,14 +31,14 @@ func Render(w http.ResponseWriter, r *http.Request, page Page, content templ.Com
2431
}
2532

2633
if err := Base(page, content).Render(r.Context(), w); err != nil {
27-
if !errors.Is(err, context.Canceled) {
34+
if !IsClientDisconnect(err) {
2835
slog.Error("failed to render page", "error", err)
2936
}
3037
}
3138
}
3239

3340
func ServerError(w http.ResponseWriter, msg string, err error) {
34-
if errors.Is(err, context.Canceled) {
41+
if IsClientDisconnect(err) {
3542
return
3643
}
3744
slog.Error(msg, "error", err)

0 commit comments

Comments
 (0)