From b4f1989b67f67a8d51cb13318e4f796cbfdfab00 Mon Sep 17 00:00:00 2001 From: Jonathan Nobels Date: Tue, 19 Mar 2024 16:13:57 -0400 Subject: [PATCH] android: fix NPE for empty localAPI response bodies (#220) Updates tailscale/corp#18202 Several API endpoints will return an empty body on success which was throwing a null pointer exception when we tried deserialize it. Signed-off-by: Jonathan Nobels --- .../main/java/com/tailscale/ipn/ui/localapi/Client.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/ui/localapi/Client.kt b/android/src/main/java/com/tailscale/ipn/ui/localapi/Client.kt index 580ad36..e8a87e0 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/localapi/Client.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/localapi/Client.kt @@ -10,6 +10,9 @@ import com.tailscale.ipn.ui.model.Ipn import com.tailscale.ipn.ui.model.IpnLocal import com.tailscale.ipn.ui.model.IpnState import com.tailscale.ipn.ui.util.InputStreamAdapter +import java.nio.charset.Charset +import kotlin.reflect.KType +import kotlin.reflect.typeOf import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -18,9 +21,6 @@ import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream import kotlinx.serialization.serializer -import java.nio.charset.Charset -import kotlin.reflect.KType -import kotlin.reflect.typeOf private object Endpoint { const val DEBUG = "debug" @@ -215,7 +215,8 @@ class Request( timeoutMillis, method, fullPath, body?.let { InputStreamAdapter(it.inputStream()) }) // TODO: use the streaming body for performance Log.d(TAG, "Got Response") - val respData = resp.bodyBytes() + // An empty body is a perfectly valid response and indicates success + val respData = resp.bodyBytes() ?: ByteArray(0) Log.d(TAG, "Got response body") val response: Result = when (responseType) {