Skip to content

Commit b5c1f2d

Browse files
committed
impl: refactor HttpJsonErrorParser to return google.rpc.Status and rename method to parseStatus
1 parent fcf5e78 commit b5c1f2d

2 files changed

Lines changed: 46 additions & 34 deletions

File tree

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

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,48 +80,44 @@ class HttpJsonErrorParser {
8080
JsonFormat.parser().ignoringUnknownFields().usingTypeRegistry(STANDARD_ERROR_TYPES);
8181

8282
/**
83-
* Parses the given JSON error payload into {@link ErrorDetails}.
83+
* Parses the given JSON error payload into {@link Status}.
8484
*
8585
* @param errorJson The JSON string representing a Google Cloud error response.
86-
* @return An {@link ErrorDetails} object containing the parsed error information. Returns an
87-
* empty {@link ErrorDetails} if the input is null, empty, or invalid.
86+
* @return A {@link Status} message containing the parsed error information. Returns {@link
87+
* Status#getDefaultInstance()} if the input is null, empty, or invalid.
8888
*/
89-
static ErrorDetails parseErrorDetails(String errorJson) {
89+
static Status parseStatus(String errorJson) {
9090
if (errorJson == null || errorJson.isEmpty()) {
91-
return ErrorDetails.builder().build();
91+
return Status.getDefaultInstance();
9292
}
9393

9494
JsonElement jsonElement;
9595
try {
9696
jsonElement = JsonParser.parseString(errorJson);
9797
} catch (JsonSyntaxException e) {
98-
return ErrorDetails.builder().build();
98+
return Status.getDefaultInstance();
9999
}
100100

101101
if (!jsonElement.isJsonObject()) {
102-
return ErrorDetails.builder().build();
102+
return Status.getDefaultInstance();
103103
}
104104
JsonObject root = jsonElement.getAsJsonObject();
105105
if (!root.has("error")) {
106-
return ErrorDetails.builder().build();
106+
return Status.getDefaultInstance();
107107
}
108108

109109
JsonElement errorElement = root.get("error");
110110
if (!errorElement.isJsonObject()) {
111-
return ErrorDetails.builder().build();
111+
return Status.getDefaultInstance();
112112
}
113113

114114
Status.Builder statusBuilder = Status.newBuilder();
115115
try {
116116
JSON_PARSER.merge(errorElement.toString(), statusBuilder);
117117
} catch (InvalidProtocolBufferException e) {
118-
// Return empty details on parsing failure
119-
return ErrorDetails.builder().build();
118+
return Status.getDefaultInstance();
120119
}
121120

122-
Status status = statusBuilder.build();
123-
ErrorDetails.Builder errorDetailsBuilder = ErrorDetails.builder();
124-
errorDetailsBuilder.setRawErrorMessages(status.getDetailsList());
125-
return errorDetailsBuilder.build();
121+
return statusBuilder.build();
126122
}
127123
}

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

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,13 @@
3939
class HttpJsonErrorParserTest {
4040

4141
@Test
42-
void parseErrorDetails_success() {
42+
void parseStatus_success() {
4343
String payload =
4444
"{\n"
4545
+ " \"error\": {\n"
46+
+ " \"code\": 401,\n"
47+
+ " \"message\": \"Request is missing required authentication credential.\",\n"
48+
+ " \"status\": \"UNAUTHENTICATED\",\n"
4649
+ " \"details\": [\n"
4750
+ " {\n"
4851
+ " \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n"
@@ -56,8 +59,14 @@ void parseErrorDetails_success() {
5659
+ " }\n"
5760
+ "}";
5861

59-
ErrorDetails errorDetails = HttpJsonErrorParser.parseErrorDetails(payload);
60-
assertThat(errorDetails).isNotNull();
62+
com.google.rpc.Status status = HttpJsonErrorParser.parseStatus(payload);
63+
assertThat(status).isNotNull();
64+
assertThat(status.getCode()).isEqualTo(401);
65+
assertThat(status.getMessage())
66+
.isEqualTo("Request is missing required authentication credential.");
67+
68+
ErrorDetails errorDetails =
69+
ErrorDetails.builder().setRawErrorMessages(status.getDetailsList()).build();
6170
ErrorInfo errorInfo = errorDetails.getErrorInfo();
6271
assertThat(errorInfo).isNotNull();
6372
assertThat(errorInfo.getReason()).isEqualTo("SERVICE_DISABLED");
@@ -66,7 +75,7 @@ void parseErrorDetails_success() {
6675
}
6776

6877
@Test
69-
void parseErrorDetails_noErrorInfo() {
78+
void parseStatus_noErrorInfo() {
7079
String payload =
7180
"{\n"
7281
+ " \"error\": {\n"
@@ -78,43 +87,50 @@ void parseErrorDetails_noErrorInfo() {
7887
+ " }\n"
7988
+ "}";
8089

81-
ErrorDetails errorDetails = HttpJsonErrorParser.parseErrorDetails(payload);
82-
assertThat(errorDetails).isNotNull();
90+
com.google.rpc.Status status = HttpJsonErrorParser.parseStatus(payload);
91+
assertThat(status).isNotNull();
92+
ErrorDetails errorDetails =
93+
ErrorDetails.builder().setRawErrorMessages(status.getDetailsList()).build();
8394
assertThat(errorDetails.getRetryInfo()).isNotNull();
8495
}
8596

8697
@Test
87-
void parseErrorDetails_emptyPayload() {
88-
assertThat(HttpJsonErrorParser.parseErrorDetails("").getErrorInfo()).isNull();
89-
assertThat(HttpJsonErrorParser.parseErrorDetails(null).getErrorInfo()).isNull();
98+
void parseStatus_emptyPayload() {
99+
assertThat(HttpJsonErrorParser.parseStatus("")).isEqualTo(com.google.rpc.Status.getDefaultInstance());
100+
assertThat(HttpJsonErrorParser.parseStatus(null)).isEqualTo(com.google.rpc.Status.getDefaultInstance());
90101
}
91102

92103
@Test
93-
void parseErrorDetails_invalidJson() {
94-
assertThat(HttpJsonErrorParser.parseErrorDetails("{invalid").getErrorInfo()).isNull();
104+
void parseStatus_invalidJson() {
105+
assertThat(HttpJsonErrorParser.parseStatus("{invalid"))
106+
.isEqualTo(com.google.rpc.Status.getDefaultInstance());
95107
}
96108

97109
@Test
98-
void parseErrorDetails_noErrorObject() {
110+
void parseStatus_noErrorObject() {
99111
String payload = "{\"foo\": \"bar\"}";
100-
assertThat(HttpJsonErrorParser.parseErrorDetails(payload).getErrorInfo()).isNull();
112+
assertThat(HttpJsonErrorParser.parseStatus(payload))
113+
.isEqualTo(com.google.rpc.Status.getDefaultInstance());
101114
}
102115

103116
@Test
104-
void parseErrorDetails_noDetails() {
117+
void parseStatus_noDetails() {
105118
String payload = "{\"error\": {}}";
106-
assertThat(HttpJsonErrorParser.parseErrorDetails(payload).getErrorInfo()).isNull();
119+
assertThat(HttpJsonErrorParser.parseStatus(payload))
120+
.isEqualTo(com.google.rpc.Status.getDefaultInstance());
107121
}
108122

109123
@Test
110-
void parseErrorDetails_garbageInError() {
124+
void parseStatus_garbageInError() {
111125
String payload = "{\"error\": \"not-an-object\"}";
112-
assertThat(HttpJsonErrorParser.parseErrorDetails(payload).getErrorInfo()).isNull();
126+
assertThat(HttpJsonErrorParser.parseStatus(payload))
127+
.isEqualTo(com.google.rpc.Status.getDefaultInstance());
113128
}
114129

115130
@Test
116-
void parseErrorDetails_arrayInError() {
131+
void parseStatus_arrayInError() {
117132
String payload = "{\"error\": []}";
118-
assertThat(HttpJsonErrorParser.parseErrorDetails(payload).getErrorInfo()).isNull();
133+
assertThat(HttpJsonErrorParser.parseStatus(payload))
134+
.isEqualTo(com.google.rpc.Status.getDefaultInstance());
119135
}
120136
}

0 commit comments

Comments
 (0)