Skip to content

Commit 76f7592

Browse files
authored
Handle failures in bestEffort mode without panicking (#160)
1 parent d756e54 commit 76f7592

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

internal/instruction/runner.go

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -138,33 +138,36 @@ func (r *Runner) runInstructionSet(hs b.Homeserver, hsURL string, instrs []instr
138138
return err
139139
}
140140
}
141-
if i < 100 || i%200 == 0 {
142-
r.log("%s [%d/%d] %s => HTTP %s\n", contextStr, i, len(instrs), req.URL.String(), res.Status)
143-
}
144-
body, err := ioutil.ReadAll(res.Body)
145-
if err != nil {
146-
err = isFatalErr(fmt.Errorf("%s : failed to read response body: %w", contextStr, err))
147-
if err != nil {
148-
return err
141+
// parse the response if we have one (if bestEffort=true then we don't return an error above)
142+
if res != nil && res.Body != nil {
143+
if i < 100 || i%200 == 0 {
144+
r.log("%s [%d/%d] %s => HTTP %s\n", contextStr, i, len(instrs), req.URL.String(), res.Status)
149145
}
150-
}
151-
if res.StatusCode < 200 || res.StatusCode >= 300 {
152-
r.log("INSTRUCTION: %+v\n", instr)
153-
err = isFatalErr(fmt.Errorf("%s : request %s returned HTTP %s : %s", contextStr, req.URL.String(), res.Status, string(body)))
146+
body, err := ioutil.ReadAll(res.Body)
154147
if err != nil {
155-
return err
148+
err = isFatalErr(fmt.Errorf("%s : failed to read response body: %w", contextStr, err))
149+
if err != nil {
150+
return err
151+
}
156152
}
157-
}
158-
if instr.storeResponse != nil {
159-
if !gjson.ValidBytes(body) {
160-
err = isFatalErr(fmt.Errorf("%s : cannot storeResponse as response is not valid JSON. Body: %s", contextStr, string(body)))
153+
if res.StatusCode < 200 || res.StatusCode >= 300 {
154+
r.log("INSTRUCTION: %+v\n", instr)
155+
err = isFatalErr(fmt.Errorf("%s : request %s returned HTTP %s : %s", contextStr, req.URL.String(), res.Status, string(body)))
161156
if err != nil {
162157
return err
163158
}
164159
}
165-
for k, v := range instr.storeResponse {
166-
val := gjson.GetBytes(body, strings.TrimPrefix(v, "."))
167-
r.lookup.Store(k, val.Str)
160+
if instr.storeResponse != nil {
161+
if !gjson.ValidBytes(body) {
162+
err = isFatalErr(fmt.Errorf("%s : cannot storeResponse as response is not valid JSON. Body: %s", contextStr, string(body)))
163+
if err != nil {
164+
return err
165+
}
166+
}
167+
for k, v := range instr.storeResponse {
168+
val := gjson.GetBytes(body, strings.TrimPrefix(v, "."))
169+
r.lookup.Store(k, val.Str)
170+
}
168171
}
169172
}
170173
req, instr, i = r.next(instrs, hsURL, i)

0 commit comments

Comments
 (0)