Handle interrupted pairing, artwork retries and revoked access reliably
This commit is contained in:
@@ -86,14 +86,18 @@ final class BridgeClient {
|
||||
let (bytes, response) = try await session.bytes(for: request)
|
||||
guard let response = response as? HTTPURLResponse else { throw BridgeError.message("Нет ответа от ПК.") }
|
||||
if response.statusCode == 401 { throw BridgeError.unauthorized }
|
||||
guard (200...299).contains(response.statusCode) else {
|
||||
throw BridgeError.message("ПК отклонил запрос (HTTP \(response.statusCode)). Проверьте код и состояние агента.")
|
||||
}
|
||||
let success = (200...299).contains(response.statusCode)
|
||||
let bodyLimit = success ? limit : min(limit, 16 * 1024)
|
||||
var result = Data()
|
||||
for try await byte in bytes {
|
||||
guard result.count < limit else { throw BridgeError.message("Ответ ПК слишком большой.") }
|
||||
guard result.count < bodyLimit else { throw BridgeError.message("Ответ ПК слишком большой.") }
|
||||
result.append(byte)
|
||||
}
|
||||
guard success else {
|
||||
struct Failure: Decodable { let code: String? }
|
||||
let code = (try? JSONDecoder().decode(Failure.self, from: result))?.code
|
||||
throw BridgeError.http(status: response.statusCode, code: code)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -101,7 +105,7 @@ final class BridgeClient {
|
||||
let body = try JSONSerialization.data(withJSONObject: ["code": code, "deviceName": "MusicBridge iPhone"])
|
||||
let response = try JSONDecoder().decode(PairResponse.self, from: await data(request("v1/pair", body: body, authenticated: false)))
|
||||
guard response.success, let token = response.token, Connection.isFingerprint(token) else {
|
||||
throw BridgeError.message("Сопряжение отклонено: \(response.code)")
|
||||
throw BridgeError.http(status: 403, code: response.code)
|
||||
}
|
||||
return token
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user