Improve error messages for incorrectly formated JSON work responses.

RELNOTES: None.
PiperOrigin-RevId: 331603943
diff --git a/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java b/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java
index 132bc8b..181bc6e 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java
@@ -18,10 +18,12 @@
 import com.google.devtools.build.lib.worker.WorkerProtocol.WorkRequest;
 import com.google.devtools.build.lib.worker.WorkerProtocol.WorkResponse;
 import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.MalformedJsonException;
 import com.google.protobuf.util.JsonFormat;
 import com.google.protobuf.util.JsonFormat.Printer;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
+import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -55,34 +57,37 @@
     Integer exitCode = null;
     String output = null;
     Integer requestId = null;
-
-    reader.beginObject();
-    while (reader.hasNext()) {
-      String name = reader.nextName();
-      switch (name) {
-        case "exitCode":
-          if (exitCode != null) {
-            throw new IOException("Work response cannot have more than one exit code");
-          }
-          exitCode = reader.nextInt();
-          break;
-        case "output":
-          if (output != null) {
-            throw new IOException("Work response cannot have more than one output");
-          }
-          output = reader.nextString();
-          break;
-        case "requestId":
-          if (requestId != null) {
-            throw new IOException("Work response cannot have more than one requestId");
-          }
-          requestId = reader.nextInt();
-          break;
-        default:
-          throw new IOException(name + " is an incorrect field in work response");
+    try {
+      reader.beginObject();
+      while (reader.hasNext()) {
+        String name = reader.nextName();
+        switch (name) {
+          case "exitCode":
+            if (exitCode != null) {
+              throw new IOException("Work response cannot have more than one exit code");
+            }
+            exitCode = reader.nextInt();
+            break;
+          case "output":
+            if (output != null) {
+              throw new IOException("Work response cannot have more than one output");
+            }
+            output = reader.nextString();
+            break;
+          case "requestId":
+            if (requestId != null) {
+              throw new IOException("Work response cannot have more than one requestId");
+            }
+            requestId = reader.nextInt();
+            break;
+          default:
+            throw new IOException(name + " is an incorrect field in work response");
+        }
       }
-    }
     reader.endObject();
+    } catch (MalformedJsonException | EOFException | IllegalStateException e) {
+      throw new IOException("Could not parse json work request correctly", e);
+    }
 
     WorkResponse.Builder responseBuilder = WorkResponse.newBuilder();
 
diff --git a/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java b/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java
index f380730..9b38382 100644
--- a/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java
@@ -283,7 +283,18 @@
       throws IOException {
     TestWorker testWorker = createTestWorker(responseString.getBytes(UTF_8), JSON);
     IOException ex = assertThrows(IOException.class, testWorker::getResponse);
-    assertThat(ex).hasMessageThat().isEqualTo(expectedError);
+    assertThat(ex).hasMessageThat().contains(expectedError);
+  }
+
+  @Test
+  public void testGetResponse_json_emptyString_throws() throws IOException {
+    verifyGetResponseFailure("", "Could not parse json work request correctly");
+  }
+
+  @Test
+  public void testGetResponse_badJson_throws() throws IOException {
+    verifyGetResponseFailure(
+        "{ \"output\": \"I'm missing a bracket\"", "Could not parse json work request correctly");
   }
 
   @Test