blob: eead44784ad47b03a3953d3dae5b7b58134d7b47 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.ozone.s3;
import org.apache.hadoop.fs.InvalidRequestException;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.ozone.s3.header.AuthenticationHeaderParser;
import org.apache.hadoop.test.GenericTestUtils;
import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.server.ContainerRequest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.SecurityContext;
import java.net.URI;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* This class test virtual host style mapping conversion to path style.
*/
public class TestVirtualHostStyleFilter {
private static OzoneConfiguration conf;
private static String s3HttpAddr;
private AuthenticationHeaderParser authenticationHeaderParser;
@Before
public void setup() {
conf = new OzoneConfiguration();
s3HttpAddr = "localhost:9878";
conf.set(S3GatewayConfigKeys.OZONE_S3G_HTTP_ADDRESS_KEY, s3HttpAddr);
s3HttpAddr = s3HttpAddr.substring(0, s3HttpAddr.lastIndexOf(":"));
conf.set(S3GatewayConfigKeys.OZONE_S3G_DOMAIN_NAME, s3HttpAddr);
authenticationHeaderParser = new AuthenticationHeaderParser();
authenticationHeaderParser.setAuthHeader("AWS ozone:scret");
}
/**
* Create containerRequest object.
* @return ContainerRequest
* @throws Exception
*/
public ContainerRequest createContainerRequest(String host, String path,
String queryParams,
boolean virtualHostStyle)
throws Exception {
URI baseUri = new URI("http://" + s3HttpAddr);
URI virtualHostStyleUri;
if (path == null && queryParams == null) {
virtualHostStyleUri = new URI("http://" + s3HttpAddr);
} else if (path != null && queryParams == null) {
virtualHostStyleUri = new URI("http://" + s3HttpAddr + path);
} else if (path !=null && queryParams != null) {
virtualHostStyleUri = new URI("http://" + s3HttpAddr + path +
queryParams);
} else {
virtualHostStyleUri = new URI("http://" + s3HttpAddr + queryParams);
}
URI pathStyleUri;
if (queryParams == null) {
pathStyleUri = new URI("http://" + s3HttpAddr + path);
} else {
pathStyleUri = new URI("http://" + s3HttpAddr + path + queryParams);
}
String httpMethod = "DELETE";
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
PropertiesDelegate propertiesDelegate = Mockito.mock(PropertiesDelegate
.class);
ContainerRequest containerRequest;
if (virtualHostStyle) {
containerRequest = new ContainerRequest(baseUri, virtualHostStyleUri,
httpMethod, securityContext, propertiesDelegate);
containerRequest.header(HttpHeaders.HOST, host);
} else {
containerRequest = new ContainerRequest(baseUri, pathStyleUri,
httpMethod, securityContext, propertiesDelegate);
containerRequest.header(HttpHeaders.HOST, host);
}
return containerRequest;
}
@Test
public void testVirtualHostStyle() throws Exception {
VirtualHostStyleFilter virtualHostStyleFilter =
new VirtualHostStyleFilter();
virtualHostStyleFilter.setConfiguration(conf);
virtualHostStyleFilter.setAuthenticationHeaderParser(
authenticationHeaderParser);
ContainerRequest containerRequest = createContainerRequest("mybucket" +
".localhost:9878", "/myfile", null, true);
virtualHostStyleFilter.filter(containerRequest);
URI expected = new URI("http://" + s3HttpAddr +
"/mybucket/myfile");
Assert.assertEquals(expected, containerRequest.getRequestUri());
}
@Test
public void testPathStyle() throws Exception {
VirtualHostStyleFilter virtualHostStyleFilter =
new VirtualHostStyleFilter();
virtualHostStyleFilter.setConfiguration(conf);
virtualHostStyleFilter.setAuthenticationHeaderParser(
authenticationHeaderParser);
ContainerRequest containerRequest = createContainerRequest(s3HttpAddr,
"/mybucket/myfile", null, false);
virtualHostStyleFilter.filter(containerRequest);
URI expected = new URI("http://" + s3HttpAddr +
"/mybucket/myfile");
Assert.assertEquals(expected, containerRequest.getRequestUri());
}
@Test
public void testVirtualHostStyleWithCreateBucketRequest() throws Exception {
VirtualHostStyleFilter virtualHostStyleFilter =
new VirtualHostStyleFilter();
virtualHostStyleFilter.setConfiguration(conf);
virtualHostStyleFilter.setAuthenticationHeaderParser(
authenticationHeaderParser);
ContainerRequest containerRequest = createContainerRequest("mybucket" +
".localhost:9878", null, null, true);
virtualHostStyleFilter.filter(containerRequest);
URI expected = new URI("http://" + s3HttpAddr + "/mybucket");
Assert.assertEquals(expected, containerRequest.getRequestUri());
}
@Test
public void testVirtualHostStyleWithQueryParams() throws Exception {
VirtualHostStyleFilter virtualHostStyleFilter =
new VirtualHostStyleFilter();
virtualHostStyleFilter.setConfiguration(conf);
virtualHostStyleFilter.setAuthenticationHeaderParser(
authenticationHeaderParser);
ContainerRequest containerRequest = createContainerRequest("mybucket" +
".localhost:9878", null, "?prefix=bh", true);
virtualHostStyleFilter.filter(containerRequest);
URI expected = new URI("http://" + s3HttpAddr + "/mybucket?prefix=bh");
assertTrue(expected.toString().contains(containerRequest.getRequestUri()
.toString()));
containerRequest = createContainerRequest("mybucket" +
".localhost:9878", null, "?prefix=bh&type=dir", true);
virtualHostStyleFilter.filter(containerRequest);
expected = new URI("http://" + s3HttpAddr +
"/mybucket?prefix=bh&type=dir");
assertTrue(expected.toString().contains(containerRequest.getRequestUri()
.toString()));
}
@Test
public void testVirtualHostStyleWithNoMatchingDomain() throws Exception {
VirtualHostStyleFilter virtualHostStyleFilter =
new VirtualHostStyleFilter();
virtualHostStyleFilter.setConfiguration(conf);
virtualHostStyleFilter.setAuthenticationHeaderParser(
authenticationHeaderParser);
ContainerRequest containerRequest = createContainerRequest("mybucket" +
".myhost:9999", null, null, true);
try {
virtualHostStyleFilter.filter(containerRequest);
fail("testVirtualHostStyleWithNoMatchingDomain");
} catch (InvalidRequestException ex) {
GenericTestUtils.assertExceptionContains("No matching domain", ex);
}
}
@Test
public void testIncorrectVirtualHostStyle() throws
Exception {
VirtualHostStyleFilter virtualHostStyleFilter =
new VirtualHostStyleFilter();
virtualHostStyleFilter.setConfiguration(conf);
virtualHostStyleFilter.setAuthenticationHeaderParser(
authenticationHeaderParser);
ContainerRequest containerRequest = createContainerRequest("mybucket" +
"localhost:9878", null, null, true);
try {
virtualHostStyleFilter.filter(containerRequest);
fail("testIncorrectVirtualHostStyle failed");
} catch (InvalidRequestException ex) {
GenericTestUtils.assertExceptionContains("invalid format", ex);
}
}
}