WIP:feat: capture and log raw response body in Feishu decoding error for better debugging

This commit is contained in:
tigerenwork 2026-07-02 10:02:02 +08:00
parent 0adfaf1d7e
commit 8286c81afb
2 changed files with 13 additions and 4 deletions

View File

@ -4,7 +4,7 @@ enum FeishuError: Error, LocalizedError {
case unauthorized
case networkError(Error?)
case apiError(code: Int, message: String)
case decodingError(Error)
case decodingError(Error, rawBody: String? = nil)
case notConfigured
case missingCredentials
@ -16,8 +16,11 @@ enum FeishuError: Error, LocalizedError {
return "Network error: \(error?.localizedDescription ?? "Unknown")"
case .apiError(let code, let message):
return "Feishu API error (\(code)): \(message)"
case .decodingError:
return "Failed to parse Feishu response. Field mappings may be incorrect."
case .decodingError(let error, let rawBody):
if let rawBody {
return "Failed to parse Feishu response: \(rawBody)"
}
return "Failed to parse Feishu response. Field mappings may be incorrect. (\(error.localizedDescription))"
case .notConfigured:
return "Feishu table not configured. Open Settings."
case .missingCredentials:

View File

@ -78,6 +78,10 @@ final class FeishuService {
guard let httpResponse = response as? HTTPURLResponse else {
throw FeishuError.networkError(nil)
}
let rawBody = String(data: data, encoding: .utf8) ?? "<binary \(data.count)B>"
BuggerLog.debug("fetchPage: HTTP \(httpResponse.statusCode) body=\(String(rawBody.prefix(500)))")
if httpResponse.statusCode == 401 {
throw FeishuError.unauthorized
}
@ -86,7 +90,9 @@ final class FeishuService {
do {
apiResponse = try decoder.decode(FeishuAPIResponse<RecordListData>.self, from: data)
} catch {
throw FeishuError.decodingError(error)
BuggerLog.error("fetchPage: decode FAILED: \(error)")
BuggerLog.error("fetchPage: raw body: \(String(rawBody.prefix(1000)))")
throw FeishuError.decodingError(error, rawBody: String(rawBody.prefix(200)))
}
guard apiResponse.code == 0, let pageData = apiResponse.data else {