Read to end-of-stream for HTTP contract tests

#minor-release

PiperOrigin-RevId: 358847933
This commit is contained in:
olly 2021-02-22 18:21:44 +00:00 committed by marcbaechinger
parent 7b692f9676
commit 691ac39fcb
3 changed files with 32 additions and 16 deletions

View File

@ -147,7 +147,6 @@ public class HttpDataSourceTestEnv extends ExternalResource {
.setName(name) .setName(name)
.setUri(Uri.parse(server.url(resource.getPath()).toString())) .setUri(Uri.parse(server.url(resource.getPath()).toString()))
.setExpectedBytes(resource.getData()) .setExpectedBytes(resource.getData())
.setEndOfInputExpected(!resource.resolvesToUnknownLength())
.build(); .build();
} }
} }

View File

@ -33,6 +33,7 @@ import com.google.common.collect.Maps;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -277,21 +278,19 @@ public class WebServerDispatcher extends Dispatcher {
if (!resource.supportsRangeRequests() || rangeHeader == null) { if (!resource.supportsRangeRequests() || rangeHeader == null) {
switch (preferredContentCoding) { switch (preferredContentCoding) {
case "gzip": case "gzip":
setResponseBody(
response, Util.gzip(resourceData), /* chunked= */ resource.resolvesToUnknownLength);
response response
.setBody(new Buffer().write(Util.gzip(resourceData)))
.setHeader("Content-Encoding", "gzip"); .setHeader("Content-Encoding", "gzip");
break; break;
case "identity": case "identity":
setResponseBody(response, resourceData, /* chunked= */ resource.resolvesToUnknownLength);
response response
.setBody(new Buffer().write(resourceData))
.setHeader("Content-Encoding", "identity"); .setHeader("Content-Encoding", "identity");
break; break;
default: default:
throw new IllegalStateException("Unexpected content coding: " + preferredContentCoding); throw new IllegalStateException("Unexpected content coding: " + preferredContentCoding);
} }
if (resource.resolvesToUnknownLength()) {
response.setHeader("Content-Length", "");
}
return response; return response;
} }
@ -328,11 +327,11 @@ public class WebServerDispatcher extends Dispatcher {
+ "-" + "-"
+ (resourceData.length - 1) + (resourceData.length - 1)
+ "/" + "/"
+ (resource.resolvesToUnknownLength() ? "*" : resourceData.length)) + (resource.resolvesToUnknownLength() ? "*" : resourceData.length));
.setBody(new Buffer().write(resourceData, start, resourceData.length - start)); setResponseBody(
if (resource.resolvesToUnknownLength()) { response,
response.setHeader("Content-Length", ""); Arrays.copyOfRange(resourceData, start, resourceData.length),
} /* chunked= */ resource.resolvesToUnknownLength);
return response; return response;
} }
@ -345,7 +344,7 @@ public class WebServerDispatcher extends Dispatcher {
} }
int end = min(range.second + 1, resourceData.length); int end = min(range.second + 1, resourceData.length);
return response response
.setResponseCode(206) .setResponseCode(206)
.setHeader( .setHeader(
"Content-Range", "Content-Range",
@ -354,8 +353,26 @@ public class WebServerDispatcher extends Dispatcher {
+ "-" + "-"
+ (end - 1) + (end - 1)
+ "/" + "/"
+ (resource.resolvesToUnknownLength() ? "*" : resourceData.length)) + (resource.resolvesToUnknownLength() ? "*" : resourceData.length));
.setBody(new Buffer().write(resourceData, range.first, end - range.first)); setResponseBody(
response, Arrays.copyOfRange(resourceData, range.first, end), /* chunked= */ false);
return response;
}
/**
* Populates a response with the specified body.
*
* @param response The response whose body should be populated.
* @param body The body data.
* @param chunked Whether to use chunked transfer encoding. Note that if set to {@code true}, the
* "Content-Length" header will not be set.
*/
private static void setResponseBody(MockResponse response, byte[] body, boolean chunked) {
if (chunked) {
response.setChunkedBody(new Buffer().write(body), /* maxChunkSize= */ Integer.MAX_VALUE);
} else {
response.setBody(new Buffer().write(body));
}
} }
/** /**

View File

@ -257,7 +257,7 @@ public class WebServerDispatcherTest {
try (Response response = client.newCall(request).execute()) { try (Response response = client.newCall(request).execute()) {
assertThat(response.code()).isEqualTo(200); assertThat(response.code()).isEqualTo(200);
assertThat(response.header("Accept-Ranges")).isEqualTo("bytes"); assertThat(response.header("Accept-Ranges")).isEqualTo("bytes");
assertThat(response.header("Content-Length")).isEmpty(); assertThat(response.header("Content-Length")).isNull();
assertThat(response.header("Content-Range")).isNull(); assertThat(response.header("Content-Range")).isNull();
assertThat(response.body().contentLength()).isEqualTo(-1); assertThat(response.body().contentLength()).isEqualTo(-1);
@ -298,7 +298,7 @@ public class WebServerDispatcherTest {
try (Response response = client.newCall(request).execute()) { try (Response response = client.newCall(request).execute()) {
assertThat(response.code()).isEqualTo(206); assertThat(response.code()).isEqualTo(206);
assertThat(response.header("Accept-Ranges")).isEqualTo("bytes"); assertThat(response.header("Accept-Ranges")).isEqualTo("bytes");
assertThat(response.header("Content-Length")).isEmpty(); assertThat(response.header("Content-Length")).isNull();
assertThat(response.header("Content-Range")).isEqualTo("bytes 5-19/*"); assertThat(response.header("Content-Range")).isEqualTo("bytes 5-19/*");
assertThat(response.body().contentLength()).isEqualTo(-1); assertThat(response.body().contentLength()).isEqualTo(-1);