Skip to content

Commit d06f7ff

Browse files
authored
fix(gateway): no duplicate WriteHeader calls (#515)
* fix(gateway): do not act on template errors * docs: changelog * feat: write error on template execution error Closes #487
1 parent 438b8a6 commit d06f7ff

File tree

6 files changed

+18
-14
lines changed

6 files changed

+18
-14
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ The following emojis are used to highlight certain changes:
2727

2828
### Fixed
2929

30-
* `boxo/gateway`: a panic (which is recovered) could sporadically be triggered inside a CAR request, if the right [conditions were met](https://github.com/ipfs/boxo/pull/511).
30+
* `boxo/gateway`
31+
* a panic (which is recovered) could sporadically be triggered inside a CAR request, if the right [conditions were met](https://github.com/ipfs/boxo/pull/511).
32+
* no longer emits `http: superfluous response.WriteHeader` warnings when an error happens.
3133

3234
### Security
3335

gateway/assets/test/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,7 @@ func runTemplate(w http.ResponseWriter, filename string, data interface{}) {
159159
}
160160
err = tpl.Execute(w, data)
161161
if err != nil {
162-
http.Error(w, fmt.Sprintf("failed to execute template: %s", err), http.StatusInternalServerError)
163-
return
162+
_, _ = w.Write([]byte(fmt.Sprintf("error during body generation: %v", err)))
164163
}
165164
}
166165

gateway/errors.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,17 @@ func webError(w http.ResponseWriter, r *http.Request, c *Config, err error, defa
165165
if acceptsHTML {
166166
w.Header().Set("Content-Type", "text/html")
167167
w.WriteHeader(code)
168-
_ = assets.ErrorTemplate.Execute(w, assets.ErrorTemplateData{
168+
err = assets.ErrorTemplate.Execute(w, assets.ErrorTemplateData{
169169
GlobalData: assets.GlobalData{
170170
Menu: c.Menu,
171171
},
172172
StatusCode: code,
173173
StatusText: http.StatusText(code),
174174
Error: err.Error(),
175175
})
176+
if err != nil {
177+
_, _ = w.Write([]byte(fmt.Sprintf("error during body generation: %v", err)))
178+
}
176179
} else {
177180
http.Error(w, err.Error(), code)
178181
}

gateway/handler.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -912,12 +912,13 @@ func (i *handler) handleSuperfluousNamespace(w http.ResponseWriter, r *http.Requ
912912
// - redirects to intendedURL after a short delay
913913

914914
w.WriteHeader(http.StatusBadRequest)
915-
if err := redirectTemplate.Execute(w, redirectTemplateData{
915+
err = redirectTemplate.Execute(w, redirectTemplateData{
916916
RedirectURL: intendedURL,
917917
SuggestedPath: intendedPath.String(),
918918
ErrorMsg: fmt.Sprintf("invalid path: %q should be %q", r.URL.Path, intendedPath.String()),
919-
}); err != nil {
920-
i.webError(w, r, fmt.Errorf("failed to redirect when fixing superfluous namespace: %w", err), http.StatusBadRequest)
919+
})
920+
if err != nil {
921+
_, _ = w.Write([]byte(fmt.Sprintf("error during body generation: %v", err)))
921922
}
922923

923924
return true

gateway/handler_codec.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,20 +195,19 @@ func (i *handler) serveCodecHTML(ctx context.Context, w http.ResponseWriter, r *
195195
w.Header().Del("Cache-Control")
196196

197197
cidCodec := mc.Code(resolvedPath.RootCid().Prefix().Codec)
198-
if err := assets.DagTemplate.Execute(w, assets.DagTemplateData{
198+
err = assets.DagTemplate.Execute(w, assets.DagTemplateData{
199199
GlobalData: i.getTemplateGlobalData(r, contentPath),
200200
Path: contentPath.String(),
201201
CID: resolvedPath.RootCid().String(),
202202
CodecName: cidCodec.String(),
203203
CodecHex: fmt.Sprintf("0x%x", uint64(cidCodec)),
204204
Node: parseNode(blockCid, blockData),
205-
}); err != nil {
206-
err = fmt.Errorf("failed to generate HTML listing for this DAG: try fetching raw block with ?format=raw: %w", err)
207-
i.webError(w, r, err, http.StatusInternalServerError)
208-
return false
205+
})
206+
if err != nil {
207+
_, _ = w.Write([]byte(fmt.Sprintf("error during body generation: %v", err)))
209208
}
210209

211-
return true
210+
return err == nil
212211
}
213212

214213
// parseNode does a best effort attempt to parse this request's block such that

gateway/handler_unixfs_dir.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (i *handler) serveDirectory(ctx context.Context, w http.ResponseWriter, r *
212212
rq.logger.Debugw("request processed", "tplDataDNSLink", globalData.DNSLink, "tplDataSize", size, "tplDataBackLink", backLink, "tplDataHash", hash)
213213

214214
if err := assets.DirectoryTemplate.Execute(w, tplData); err != nil {
215-
i.webError(w, r, err, http.StatusInternalServerError)
215+
_, _ = w.Write([]byte(fmt.Sprintf("error during body generation: %v", err)))
216216
return false
217217
}
218218

0 commit comments

Comments
 (0)