in Sources/OSS/Internal/ResponseHandler.swift [21:64]
func onResponse(request: RequestMessage, response: ResponseMessage) throws {
if response.statusCode / 100 == 2 {
return
}
var errorFields: [String: String] = [:]
var body: Data?
body = try? response.content?.readData()
// read from x-oss-error
if body == nil || body!.count == 0 {
if let str = response.headers[caseInsensitive: "x-oss-error"] {
let base64EncodedData = str.data(using: .utf8)!
body = Data(base64Encoded: base64EncodedData)
}
}
/// try to parse error message
if let bodyData = body, bodyData.count > 0 {
do {
let dict = try Dictionary<String, Any>.withXMLData(data: bodyData)
if let error = dict["Error"], let fields = error as? [String: String] {
for (key, value) in fields {
errorFields[key] = value
}
} else {
let bodyStr = String(data: bodyData, encoding: .utf8) ?? ""
errorFields["Message"] =
"Not found tag <Error>, part response body \(bodyStr.prefix(256))"
}
} catch {
let bodyStr = String(data: bodyData, encoding: .utf8) ?? ""
errorFields["Message"] =
"Failed to parse xml from response body, part response body \(bodyStr.prefix(256))"
}
}
throw ServerError(
statusCode: response.statusCode,
headers: response.headers,
errorFields: errorFields,
requestTarget: "\(request.method) \(request.requestUri.absoluteString)",
snapshot: body
)
}