Read to end-of-stream for HTTP contract tests
#minor-release PiperOrigin-RevId: 358847933
This commit is contained in:
parent
7b692f9676
commit
691ac39fcb
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user