@@ -147,35 +147,30 @@ func (c *Cube) Start(r *http.Request, w http.ResponseWriter) (request *CubeReque
147
147
}
148
148
149
149
// Recover handles a panic
150
- func (c * Cube ) Recover (cr * CubeRequest ) {
151
- var err error
152
-
153
- if r := recover (); r != nil {
154
- switch r := r .(type ) {
155
- case error :
156
- err = r
157
- default :
158
- err = fmt .Errorf ("%v" , r )
159
- }
160
- stack := make ([]byte , 4 << 10 ) // 4 KB
161
- length := runtime .Stack (stack , false )
162
- cr .Error = err .Error ()
163
- cr .StackTrace = string (stack [:length ])
164
- cr .recovered = true
150
+ func (c * Cube ) Recover (r interface {}, cr * CubeRequest ) {
151
+ err , ok := r .(error )
152
+ if ! ok {
153
+ err = fmt .Errorf ("%v" , r )
165
154
}
155
+ stack := make ([]byte , 4 << 10 ) // 4 KB
156
+ length := runtime .Stack (stack , false )
157
+ cr .Error = err .Error ()
158
+ cr .StackTrace = string (stack [:length ])
159
+ cr .recovered = true
166
160
}
167
161
168
162
// Stop stops recording an HTTP request.
169
163
func (c * Cube ) Stop (r * CubeRequest , status int , size int64 ) {
164
+ if r .recovered {
165
+ status = http .StatusInternalServerError
166
+ }
170
167
atomic .AddInt64 (& c .activeRequests , - 1 )
171
168
r .Status = status
172
169
r .BytesOut = size
173
170
r .Latency = int64 (time .Now ().Sub (r .Time ))
174
171
175
172
// Dispatch batch
176
- if r .recovered ||
177
- r .Status >= 500 && r .Status < 600 ||
178
- c .requestsLength () >= c .BatchSize {
173
+ if r .Status >= 500 && r .Status < 600 || c .requestsLength () >= c .BatchSize {
179
174
go func () {
180
175
if err := c .dispatch (); err != nil {
181
176
c .logger .Error (err )
0 commit comments