| 6292 | } |
| 6293 | |
| 6294 | func readAPIErrorBody(statusCode int, status string, body []byte) error { |
| 6295 | var payload struct { |
| 6296 | Error string `json:"error"` |
| 6297 | } |
| 6298 | if len(body) > 0 && json.Unmarshal(body, &payload) == nil && strings.TrimSpace(payload.Error) != "" { |
| 6299 | return errors.New(redactToolDiagnostic(payload.Error)) |
| 6300 | } |
| 6301 | var memoryPayload contract.MemoryErrorPayload |
| 6302 | if len(body) > 0 && json.Unmarshal(body, &memoryPayload) == nil && |
| 6303 | strings.TrimSpace(memoryPayload.Code) != "" { |
| 6304 | message := strings.TrimSpace(memoryPayload.Message) |
| 6305 | if message == "" { |
| 6306 | message = strings.TrimSpace(memoryPayload.Code) |
| 6307 | } |
| 6308 | return fmt.Errorf("%s: %s", strings.TrimSpace(memoryPayload.Code), redactToolDiagnostic(message)) |
| 6309 | } |
| 6310 | var toolPayload contract.ToolErrorResponse |
| 6311 | if len(body) > 0 && json.Unmarshal(body, &toolPayload) == nil && toolPayload.Error.Code != "" { |
| 6312 | return newToolAPIError(statusCode, status, toolPayload) |
| 6313 | } |
| 6314 | |
| 6315 | message := strings.TrimSpace(string(body)) |
| 6316 | if message == "" { |
| 6317 | message = status |
| 6318 | } |
| 6319 | message = redactToolDiagnostic(message) |
| 6320 | if strings.TrimSpace(status) == "" { |
| 6321 | return errors.New(message) |
| 6322 | } |
| 6323 | return fmt.Errorf("daemon api %s: %s", status, message) |
| 6324 | } |
| 6325 | |
| 6326 | func drainResponseBody(method string, path string, body io.Reader) error { |
| 6327 | if _, err := io.Copy(io.Discard, body); err != nil { |