use of org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaders in project ambry by linkedin.
the class FrontendIntegrationTest method doPostGetHeadDeleteTest.
// postGetHeadDeleteTest() and multipartPostGetHeadTest() helpers
/**
* Utility to test blob POST, GET, HEAD and DELETE operations for a specified size
* @param contentSize the size of the blob to be tested
* @param toPostAccount the {@link Account} to use in post headers. Can be {@code null} if only using service ID.
* @param toPostContainer the {@link Container} to use in post headers. Can be {@code null} if only using service ID.
* @param serviceId the serviceId to use for the POST
* @param isPrivate the isPrivate flag to pass as part of the POST
* @param expectedAccountName the expected account name in some response.
* @param expectedContainerName the expected container name in some responses.
* @param multipartPost {@code true} if multipart POST is desired, {@code false} otherwise.
* @throws Exception
*/
private void doPostGetHeadDeleteTest(int contentSize, Account toPostAccount, Container toPostContainer, String serviceId, boolean isPrivate, String expectedAccountName, String expectedContainerName, boolean multipartPost) throws Exception {
ByteBuffer content = ByteBuffer.wrap(TestUtils.getRandomBytes(contentSize));
String contentType = "application/octet-stream";
String ownerId = "postGetHeadDeleteOwnerID";
String accountNameInPost = toPostAccount != null ? toPostAccount.getName() : null;
String containerNameInPost = toPostContainer != null ? toPostContainer.getName() : null;
HttpHeaders headers = new DefaultHttpHeaders();
setAmbryHeadersForPut(headers, 7200, isPrivate, serviceId, contentType, ownerId, accountNameInPost, containerNameInPost);
String blobId;
byte[] usermetadata = null;
if (multipartPost) {
usermetadata = UtilsTest.getRandomString(32).getBytes();
blobId = multipartPostBlobAndVerify(headers, content, ByteBuffer.wrap(usermetadata));
} else {
headers.add(RestUtils.Headers.USER_META_DATA_HEADER_PREFIX + "key1", "value1");
headers.add(RestUtils.Headers.USER_META_DATA_HEADER_PREFIX + "key2", "value2");
blobId = postBlobAndVerify(headers, content);
}
headers.add(RestUtils.Headers.BLOB_SIZE, content.capacity());
getBlobAndVerify(blobId, null, null, headers, isPrivate, content);
getHeadAndVerify(blobId, null, null, headers, isPrivate, expectedAccountName, expectedContainerName);
getBlobAndVerify(blobId, null, GetOption.None, headers, isPrivate, content);
getHeadAndVerify(blobId, null, GetOption.None, headers, isPrivate, expectedAccountName, expectedContainerName);
ByteRange range = ByteRange.fromLastNBytes(ThreadLocalRandom.current().nextLong(content.capacity() + 1));
getBlobAndVerify(blobId, range, null, headers, isPrivate, content);
getHeadAndVerify(blobId, range, null, headers, isPrivate, expectedAccountName, expectedContainerName);
if (contentSize > 0) {
range = ByteRange.fromStartOffset(ThreadLocalRandom.current().nextLong(content.capacity()));
getBlobAndVerify(blobId, range, null, headers, isPrivate, content);
getHeadAndVerify(blobId, range, null, headers, isPrivate, expectedAccountName, expectedContainerName);
long random1 = ThreadLocalRandom.current().nextLong(content.capacity());
long random2 = ThreadLocalRandom.current().nextLong(content.capacity());
range = ByteRange.fromOffsetRange(Math.min(random1, random2), Math.max(random1, random2));
getBlobAndVerify(blobId, range, null, headers, isPrivate, content);
getHeadAndVerify(blobId, range, null, headers, isPrivate, expectedAccountName, expectedContainerName);
}
getNotModifiedBlobAndVerify(blobId, null, isPrivate);
getUserMetadataAndVerify(blobId, null, headers, usermetadata);
getBlobInfoAndVerify(blobId, null, headers, isPrivate, expectedAccountName, expectedContainerName, usermetadata);
deleteBlobAndVerify(blobId);
// check GET, HEAD and DELETE after delete.
verifyOperationsAfterDelete(blobId, headers, isPrivate, expectedAccountName, expectedContainerName, content, usermetadata);
}
use of org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaders in project ambry by linkedin.
the class FrontendIntegrationTest method multipartPostGetHeadTest.
/**
* Tests multipart POST and verifies it via GET operations.
* @throws Exception
*/
@Test
public void multipartPostGetHeadTest() throws Exception {
Account refAccount = ACCOUNT_SERVICE.createAndAddRandomAccount();
Container refContainer = refAccount.getContainerById(Container.DEFAULT_PUBLIC_CONTAINER_ID);
doPostGetHeadDeleteTest(0, refAccount, refContainer, refAccount.getName(), !refContainer.isCacheable(), refAccount.getName(), refContainer.getName(), true);
doPostGetHeadDeleteTest(FRONTEND_CONFIG.frontendChunkedGetResponseThresholdInBytes * 3, refAccount, refContainer, refAccount.getName(), !refContainer.isCacheable(), refAccount.getName(), refContainer.getName(), true);
// failure case
// size of content being POSTed is higher than what is allowed via multipart/form-data
long maxAllowedSizeBytes = new NettyConfig(FRONTEND_VERIFIABLE_PROPS).nettyMultipartPostMaxSizeBytes;
ByteBuffer content = ByteBuffer.wrap(TestUtils.getRandomBytes((int) maxAllowedSizeBytes + 1));
HttpHeaders headers = new DefaultHttpHeaders();
setAmbryHeadersForPut(headers, 7200, !refContainer.isCacheable(), refAccount.getName(), "application/octet-stream", null, refAccount.getName(), refContainer.getName());
HttpRequest httpRequest = RestTestUtils.createRequest(HttpMethod.POST, "/", headers);
HttpPostRequestEncoder encoder = createEncoder(httpRequest, content, ByteBuffer.allocate(0));
ResponseParts responseParts = nettyClient.sendRequest(encoder.finalizeRequest(), encoder, null).get();
HttpResponse response = getHttpResponse(responseParts);
assertEquals("Unexpected response status", HttpResponseStatus.REQUEST_ENTITY_TOO_LARGE, response.status());
assertTrue("No Date header", response.headers().getTimeMillis(HttpHeaderNames.DATE, -1) != -1);
assertFalse("Channel should not be active", HttpUtil.isKeepAlive(response));
}
use of org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaders in project ambry by linkedin.
the class FrontendIntegrationTest method verifyOperationsAfterDelete.
/**
* Verifies that the right response code is returned for GET, HEAD and DELETE once a blob is deleted.
* @param blobId the ID of the blob that was deleted.
* @param expectedHeaders the expected headers in the response if the right options are provided.
* @param isPrivate {@code true} if the blob is expected to be private
* @param accountName the expected account name in {@code response}.
* @param containerName the expected container name in {@code response}.
* @param expectedContent the expected content of the blob if the right options are provided.
* @param usermetadata if non-null, this is expected to come as the body.
* @throws Exception
*/
private void verifyOperationsAfterDelete(String blobId, HttpHeaders expectedHeaders, boolean isPrivate, String accountName, String containerName, ByteBuffer expectedContent, byte[] usermetadata) throws Exception {
HttpHeaders headers = new DefaultHttpHeaders().add(RestUtils.Headers.GET_OPTION, GetOption.None.toString());
FullHttpRequest httpRequest = buildRequest(HttpMethod.GET, blobId, null, null);
verifyDeleted(httpRequest, HttpResponseStatus.GONE);
httpRequest = buildRequest(HttpMethod.GET, blobId, headers, null);
verifyDeleted(httpRequest, HttpResponseStatus.GONE);
httpRequest = buildRequest(HttpMethod.HEAD, blobId, null, null);
verifyDeleted(httpRequest, HttpResponseStatus.GONE);
httpRequest = buildRequest(HttpMethod.HEAD, blobId, headers, null);
verifyDeleted(httpRequest, HttpResponseStatus.GONE);
httpRequest = buildRequest(HttpMethod.DELETE, blobId, null, null);
verifyDeleted(httpRequest, HttpResponseStatus.ACCEPTED);
GetOption[] options = { GetOption.Include_Deleted_Blobs, GetOption.Include_All };
for (GetOption option : options) {
getBlobAndVerify(blobId, null, option, expectedHeaders, isPrivate, expectedContent);
getNotModifiedBlobAndVerify(blobId, option, isPrivate);
getUserMetadataAndVerify(blobId, option, expectedHeaders, usermetadata);
getBlobInfoAndVerify(blobId, option, expectedHeaders, isPrivate, accountName, containerName, usermetadata);
getHeadAndVerify(blobId, null, option, expectedHeaders, isPrivate, accountName, containerName);
}
}
use of org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaders in project ambry by linkedin.
the class FrontendIntegrationTest method getUserMetadataAndVerify.
/**
* Gets the user metadata of the blob with blob ID {@code blobId} and verifies them against what is expected.
* @param blobId the blob ID of the blob to HEAD.
* @param getOption the options to use while getting the blob.
* @param expectedHeaders the expected headers in the response.
* @param usermetadata if non-null, this is expected to come as the body.
* @throws ExecutionException
* @throws InterruptedException
*/
private void getUserMetadataAndVerify(String blobId, GetOption getOption, HttpHeaders expectedHeaders, byte[] usermetadata) throws ExecutionException, InterruptedException {
HttpHeaders headers = new DefaultHttpHeaders();
if (getOption != null) {
headers.add(RestUtils.Headers.GET_OPTION, getOption.toString());
}
FullHttpRequest httpRequest = buildRequest(HttpMethod.GET, blobId + "/" + RestUtils.SubResource.UserMetadata, headers, null);
ResponseParts responseParts = nettyClient.sendRequest(httpRequest, null, null).get();
HttpResponse response = getHttpResponse(responseParts);
assertEquals("Unexpected response status", HttpResponseStatus.OK, response.status());
checkCommonGetHeadHeaders(response.headers());
verifyUserMetadata(expectedHeaders, response, usermetadata, responseParts.queue);
assertTrue("Channel should be active", HttpUtil.isKeepAlive(response));
}
use of org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaders in project ambry by linkedin.
the class FrontendIntegrationTest method getNotModifiedBlobAndVerify.
/**
* Gets the blob with blob ID {@code blobId} and verifies that the blob is not returned as blob is not modified
* @param blobId the blob ID of the blob to GET.
* @param getOption the options to use while getting the blob.
* @param isPrivate {@code true} if the blob is private, {@code false} if not.
* @throws Exception
*/
private void getNotModifiedBlobAndVerify(String blobId, GetOption getOption, boolean isPrivate) throws Exception {
HttpHeaders headers = new DefaultHttpHeaders();
if (getOption != null) {
headers.add(RestUtils.Headers.GET_OPTION, getOption.toString());
}
headers.add(RestUtils.Headers.IF_MODIFIED_SINCE, new Date());
FullHttpRequest httpRequest = buildRequest(HttpMethod.GET, blobId, headers, null);
ResponseParts responseParts = nettyClient.sendRequest(httpRequest, null, null).get();
HttpResponse response = getHttpResponse(responseParts);
assertEquals("Unexpected response status", HttpResponseStatus.NOT_MODIFIED, response.status());
assertNotNull("Date header should be set", response.headers().get(RestUtils.Headers.DATE));
assertNotNull("Last-Modified header should be set", response.headers().get("Last-Modified"));
assertNull("Content-Length should not be set", response.headers().get(RestUtils.Headers.CONTENT_LENGTH));
assertNull("Accept-Ranges should not be set", response.headers().get(RestUtils.Headers.ACCEPT_RANGES));
assertNull("Content-Range header should not be set", response.headers().get(RestUtils.Headers.CONTENT_RANGE));
assertNull(RestUtils.Headers.BLOB_SIZE + " should have been null ", response.headers().get(RestUtils.Headers.BLOB_SIZE));
assertNull("Content-Type should have been null", response.headers().get(RestUtils.Headers.CONTENT_TYPE));
verifyCacheHeaders(isPrivate, response);
assertNoContent(responseParts.queue);
}
Aggregations