Skip to content

Commit dca860d

Browse files
authored
fix(http): return error in case of panic (#250)
1 parent 84704fd commit dca860d

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

http/errors_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,18 @@ func TestErrors(t *testing.T) {
112112
status: "200 OK",
113113
bodyStr: "the reader call returns a reader.",
114114
},
115+
116+
{
117+
path: []string{"panic"},
118+
status: "500 Internal Server Error",
119+
bodyStr: `{"Message":"an error occurred","Code":0,"Type":"error"}` + "\n",
120+
},
121+
{
122+
path: []string{"latepanic"},
123+
status: "200 OK",
124+
bodyStr: `"some value"` + "\n",
125+
errTrailer: "an error occurred",
126+
},
115127
}
116128

117129
mkTest := func(tc testcase) func(*testing.T) {

http/handler.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,21 @@ type requestLogger interface {
8989
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
9090
log.Debug("incoming API request: ", r.URL)
9191

92+
var re ResponseEmitter
93+
9294
defer func() {
9395
if r := recover(); r != nil {
9496
log.Error("a panic has occurred in the commands handler!")
9597
log.Error(r)
9698
log.Errorf("stack trace:\n%s", debug.Stack())
99+
100+
if re != nil {
101+
if err := re.CloseWithError(errors.New("an error occurred")); err != nil {
102+
log.Errorf("error closing ResponseEmitter: %s", err)
103+
104+
return
105+
}
106+
}
97107
}
98108
}()
99109

@@ -178,7 +188,7 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
178188
}
179189
defer cancel()
180190

181-
re, err := NewResponseEmitter(w, r.Method, req, withRequestBodyEOFChan(bodyEOFChan))
191+
re, err = NewResponseEmitter(w, r.Method, req, withRequestBodyEOFChan(bodyEOFChan))
182192
if err != nil {
183193
http.Error(w, err.Error(), http.StatusBadRequest)
184194
return

http/handler_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,19 @@ var (
287287
}),
288288
},
289289
},
290+
291+
"panic": {
292+
Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error {
293+
panic("Invalid memory address or nil pointer dereference")
294+
},
295+
},
296+
"latepanic": {
297+
Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error {
298+
re.Emit("some value")
299+
panic("Invalid memory address or nil pointer dereference")
300+
},
301+
Type: "",
302+
},
290303
},
291304
}
292305
)

0 commit comments

Comments
 (0)