diff --git a/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonStatusCode.java b/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonStatusCode.java index 60374761d..7ad2df820 100644 --- a/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonStatusCode.java +++ b/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonStatusCode.java @@ -80,6 +80,10 @@ static StatusCode.Code httpStatusToStatusCode(int httpStatus, String errorMessag } else { return Code.ABORTED; } + case 411: + throw new IllegalStateException( + "411 status code received (Content-Length header not given.) Please file a bug against https://github.com/googleapis/gax-java/\n" + + httpStatus); case 429: return Code.RESOURCE_EXHAUSTED; case 499: diff --git a/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpRequestRunnable.java b/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpRequestRunnable.java index 55e6d50e7..1c449dca5 100644 --- a/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpRequestRunnable.java +++ b/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpRequestRunnable.java @@ -29,7 +29,9 @@ */ package com.google.api.gax.httpjson; +import com.google.api.client.http.EmptyContent; import com.google.api.client.http.GenericUrl; +import com.google.api.client.http.HttpContent; import com.google.api.client.http.HttpMediaType; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestFactory; @@ -88,12 +90,16 @@ HttpRequest createHttpRequest() throws IOException { // Create HTTP request body. String requestBody = requestFormatter.getRequestBody(getRequest()); - JsonHttpContent jsonHttpContent = null; + HttpContent jsonHttpContent; if (!Strings.isNullOrEmpty(requestBody)) { getJsonFactory().createJsonParser(requestBody).parse(tokenRequest); jsonHttpContent = new JsonHttpContent(getJsonFactory(), tokenRequest) .setMediaType((new HttpMediaType("application/json"))); + } else { + // Force underlying HTTP lib to set Content-Length header to avoid 411s. + // See EmptyContent.java. + jsonHttpContent = new EmptyContent(); } // Populate URL path and query parameters. diff --git a/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpRequestRunnableTest.java b/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpRequestRunnableTest.java index e92f1ad8a..1da36dd8d 100644 --- a/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpRequestRunnableTest.java +++ b/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpRequestRunnableTest.java @@ -29,6 +29,7 @@ */ package com.google.api.gax.httpjson; +import com.google.api.client.http.EmptyContent; import com.google.api.client.http.HttpRequest; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.testing.http.MockHttpTransport; @@ -161,6 +162,7 @@ public String serialize(Void response) { @Test public void testRequestUrl() throws IOException { HttpRequest httpRequest = httpRequestRunnable.createHttpRequest(); + Truth.assertThat(httpRequest.getContent()).isInstanceOf(EmptyContent.class); String expectedUrl = ENDPOINT + "name/feline" + "?food=bird&food=mouse&size=small"; Truth.assertThat(httpRequest.getUrl().toString()).isEqualTo(expectedUrl); }