Skip to content

Commit

Permalink
fix: Use UTF-8 as default charset for HttpJson requests (#1477)
Browse files Browse the repository at this point in the history
Thank you for opening a Pull Request! For general contributing guidelines, please refer to [contributing guide](https://togithub.com/googleapis/gapic-generator-java/blob/main/CONTRIBUTING.md)

Before submitting your PR, there are a few things you can do to make sure it goes smoothly:

- [x] Make sure to open an issue as a [bug/issue](https://togithub.com/googleapis/gapic-generator-java/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)

Fixes #1437
  • Loading branch information
lqiu96 authored Mar 20, 2023
1 parent 960067a commit 79d986b
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ HttpRequest createHttpRequest() throws IOException {
jsonFactory.createJsonParser(requestBody).parse(tokenRequest);
jsonHttpContent =
new JsonHttpContent(jsonFactory, tokenRequest)
.setMediaType((new HttpMediaType("application/json")));
.setMediaType((new HttpMediaType("application/json; charset=utf-8")));
} else {
// Force underlying HTTP lib to set Content-Length header to avoid 411s.
// See EmptyContent.java.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
import com.google.longrunning.ListOperationsRequest;
import com.google.protobuf.Empty;
import com.google.protobuf.Field;
import com.google.protobuf.util.JsonFormat;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
Expand Down Expand Up @@ -177,4 +179,67 @@ public void testRequestUrlUnnormalizedPatch() throws IOException {
Truth.assertThat(httpRequest.getRequestMethod()).isEqualTo("POST");
Truth.assertThat(httpRequest.getHeaders().get("X-HTTP-Method-Override")).isEqualTo("PATCH");
}

/*
We use a separate RequestFormatter because formatting the body requests is what sets the charset to be UTF-8.
The other tests above do not have a set a body request and instead send an EmptyContent (null Type/ CharSet)
*/
@Test
public void testUnicodeValuesInBody() throws IOException {
HttpRequestFormatter<Field> bodyRequestFormatter =
ProtoMessageRequestFormatter.<Field>newBuilder()
.setPath(
"/name/{name=*}",
request -> {
Map<String, String> fields = new HashMap<>();
ProtoRestSerializer<Field> serializer = ProtoRestSerializer.create();
serializer.putPathParam(fields, "name", request.getName());
return fields;
})
.setQueryParamsExtractor(request -> new HashMap<>())
.setRequestBodyExtractor(
request ->
ProtoRestSerializer.create().toBody("*", request.toBuilder().build(), true))
.build();

Field bodyRequestMessage =
Field.newBuilder()
.setName("feline ☺ → ←")
.setNumber(2)
.setDefaultValue("bird ☺ → ←")
.setJsonName("mouse ☺ → ←")
.setTypeUrl("small ☺ → ←")
.build();

ApiMethodDescriptor<Field, Empty> methodDescriptor =
ApiMethodDescriptor.<Field, Empty>newBuilder()
.setFullMethodName("house.cat.get")
.setHttpMethod("PUT")
.setRequestFormatter(bodyRequestFormatter)
.setResponseParser(responseParser)
.build();

HttpRequestRunnable<Field, Empty> httpRequestRunnable =
new HttpRequestRunnable<>(
bodyRequestMessage,
methodDescriptor,
"www.googleapis.com/animals/v1/projects",
HttpJsonCallOptions.newBuilder().build(),
new MockHttpTransport(),
HttpJsonMetadata.newBuilder().build(),
(result) -> {});

HttpRequest httpRequest = httpRequestRunnable.createHttpRequest();
Truth.assertThat(httpRequest.getContent().getType())
.isEqualTo("application/json; charset=utf-8");
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
// writeTo() uses the Charset when writing to the stream
httpRequest.getContent().writeTo(byteArrayOutputStream);
String output = byteArrayOutputStream.toString();
Field.Builder expectedBuilder = Field.newBuilder();
JsonFormat.parser().merge(output, expectedBuilder);
Field result = expectedBuilder.build();
Truth.assertThat(result).isEqualTo(bodyRequestMessage);
}
}
}

0 comments on commit 79d986b

Please sign in to comment.