Skip to content

Commit 49b5f46

Browse files
committed
impl(gax-httpjson): return empty ErrorDetails for all parsing problems and localize catches
1 parent ec3b60a commit 49b5f46

2 files changed

Lines changed: 28 additions & 19 deletions

File tree

gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonErrorParser.java

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.gson.JsonElement;
3636
import com.google.gson.JsonObject;
3737
import com.google.gson.JsonParser;
38+
import com.google.gson.JsonSyntaxException;
3839
import com.google.protobuf.InvalidProtocolBufferException;
3940
import com.google.protobuf.TypeRegistry;
4041
import com.google.protobuf.util.JsonFormat;
@@ -94,28 +95,37 @@ static ErrorDetails parseErrorDetails(String errorJson) {
9495
return ErrorDetails.builder().build();
9596
}
9697

98+
JsonElement jsonElement;
9799
try {
98-
JsonObject root = JsonParser.parseString(errorJson).getAsJsonObject();
99-
if (!root.has("error")) {
100-
return ErrorDetails.builder().build();
101-
}
100+
jsonElement = JsonParser.parseString(errorJson);
101+
} catch (JsonSyntaxException e) {
102+
return ErrorDetails.builder().build();
103+
}
102104

103-
JsonElement errorElement = root.get("error");
104-
if (!errorElement.isJsonObject()) {
105-
return ErrorDetails.builder().build();
106-
}
105+
if (!jsonElement.isJsonObject()) {
106+
return ErrorDetails.builder().build();
107+
}
108+
JsonObject root = jsonElement.getAsJsonObject();
109+
if (!root.has("error")) {
110+
return ErrorDetails.builder().build();
111+
}
107112

108-
Status.Builder statusBuilder = Status.newBuilder();
109-
JSON_PARSER.merge(errorElement.toString(), statusBuilder);
110-
Status status = statusBuilder.build();
113+
JsonElement errorElement = root.get("error");
114+
if (!errorElement.isJsonObject()) {
115+
return ErrorDetails.builder().build();
116+
}
111117

112-
ErrorDetails.Builder errorDetailsBuilder = ErrorDetails.builder();
113-
errorDetailsBuilder.setRawErrorMessages(status.getDetailsList());
114-
return errorDetailsBuilder.build();
118+
Status.Builder statusBuilder = Status.newBuilder();
119+
try {
120+
JSON_PARSER.merge(errorElement.toString(), statusBuilder);
115121
} catch (InvalidProtocolBufferException e) {
116-
throw new RuntimeException("Failed to parse Google Cloud error response", e);
117-
} catch (Exception e) {
118-
throw new RuntimeException("Unexpected error during Google Cloud error parsing", e);
122+
// Return empty details on parsing failure
123+
return ErrorDetails.builder().build();
119124
}
125+
126+
Status status = statusBuilder.build();
127+
ErrorDetails.Builder errorDetailsBuilder = ErrorDetails.builder();
128+
errorDetailsBuilder.setRawErrorMessages(status.getDetailsList());
129+
return errorDetailsBuilder.build();
120130
}
121131
}

gax-java/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonErrorParserTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ void parseErrorDetails_emptyPayload() {
9292

9393
@Test
9494
void parseErrorDetails_invalidJson() {
95-
Assertions.assertThrows(
96-
RuntimeException.class, () -> HttpJsonErrorParser.parseErrorDetails("{invalid"));
95+
assertThat(HttpJsonErrorParser.parseErrorDetails("{invalid").getErrorInfo()).isNull();
9796
}
9897

9998
@Test

0 commit comments

Comments
 (0)