Skip to content

Commit

Permalink
Merge pull request #48 from msavy/multimap-rebase
Browse files Browse the repository at this point in the history
Multimap changes to plugins
  • Loading branch information
EricWittmann committed Feb 8, 2016
2 parents 20b7ea1 + b870dcb commit b8bd58b
Show file tree
Hide file tree
Showing 12 changed files with 76 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,14 @@
import io.apiman.gateway.engine.async.IAsyncResultHandler;
import io.apiman.gateway.engine.beans.ApiRequest;
import io.apiman.gateway.engine.beans.ApiResponse;
import io.apiman.gateway.engine.beans.HeaderHashMap;
import io.apiman.gateway.engine.beans.PolicyFailure;
import io.apiman.gateway.engine.beans.PolicyFailureType;
import io.apiman.gateway.engine.beans.exceptions.ConnectorException;
import io.apiman.gateway.engine.beans.util.HeaderMap;
import io.apiman.gateway.engine.components.IPolicyFailureFactoryComponent;
import io.apiman.gateway.engine.io.IApimanBuffer;
import io.apiman.plugins.cors_policy.util.HttpHelper;

import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
Expand Down Expand Up @@ -62,8 +61,8 @@ public class CorsConnector implements IApiConnector {
// CORS conversation related fields
private CorsConfigBean config;
private ApiRequest request;
private Map<String, String> requestHeaders;
private Map<String, String> responseHeaders = new HeaderHashMap();
private HeaderMap requestHeaders;
private HeaderMap responseHeaders = new HeaderMap();
private boolean shortCircuit = false;
private PolicyFailure failure = null;
private IPolicyFailureFactoryComponent failureFactory;
Expand Down Expand Up @@ -114,7 +113,7 @@ public PolicyFailure getFailure() {
/**
* @return Calculated CORs response headers
*/
public Map<String, String> getResponseHeaders() {
public HeaderMap getResponseHeaders() {
return responseHeaders;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.apiman.gateway.engine.IApiConnector;
import io.apiman.gateway.engine.beans.ApiRequest;
import io.apiman.gateway.engine.beans.ApiResponse;
import io.apiman.gateway.engine.beans.util.CaseInsensitiveStringMultiMap;
import io.apiman.gateway.engine.components.IPolicyFailureFactoryComponent;
import io.apiman.gateway.engine.policies.AbstractMappedPolicy;
import io.apiman.gateway.engine.policy.IConnectorInterceptor;
Expand Down Expand Up @@ -106,7 +107,7 @@ protected void doApply(ApiResponse response, IPolicyContext context, CorsConfigB
chain.doApply(response);
}

private void setResponseHeaders(IPolicyContext context, Map<String, String> response) {
private void setResponseHeaders(IPolicyContext context, CaseInsensitiveStringMultiMap response) {
context.setAttribute(CORS_SIMPLE_RESPONSE_HEADERS, response);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@

import static org.mockito.BDDMockito.given;

import io.apiman.gateway.engine.beans.util.HeaderMap;
import io.apiman.plugins.cors_policy.util.HttpHelper;

import java.util.Map;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
Expand Down Expand Up @@ -51,7 +50,7 @@ public void shouldSucceedWithMandatoryFields() {
setRequestMethods(new String[] { "GET" });

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertTrue(connector.isShortcircuit());
Expand All @@ -70,7 +69,7 @@ public void shouldFailWithDisallowedMethods() {
setRequestMethods(new String[] { "DELETE" });

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(connector.isFailure());
Assert.assertEquals(400, connector.getFailure().getResponseCode());
Expand All @@ -90,7 +89,7 @@ public void shouldSucceedWithAllowedHeaders() {
setRequestHeaders(new String[] { "x-monument", "x-penshaw" } );

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertTrue(connector.isShortcircuit());
Expand All @@ -107,7 +106,7 @@ public void shouldFailWithDisallowedHeaders() {
setRequestHeaders(new String[] { "x-penshaw", "x-monument" } );

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(connector.isFailure());
Assert.assertTrue(!connector.isShortcircuit());
Expand All @@ -122,7 +121,7 @@ public void shouldSetMaxAgeHeaderIfConfigSet() {
config.setMaxAge(9001);

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertTrue(connector.isShortcircuit());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@

import static org.mockito.BDDMockito.given;

import io.apiman.gateway.engine.beans.util.HeaderMap;
import io.apiman.plugins.cors_policy.util.HttpHelper;

import java.util.Map;

import org.junit.Assert;
import org.junit.Test;

Expand Down Expand Up @@ -57,7 +56,7 @@ public void shouldAllowAnyOriginWithStar() {
allowOrigins.add("thiswillbeignored");

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertEquals("blergs", responseHeaders.get(CorsConnector.AC_ALLOW_ORIGIN_KEY));
Expand All @@ -74,7 +73,7 @@ public void shouldAllowWhenOriginMatchesHost() {
allowOrigins.add("someotherorigin");

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertEquals("panacalty", responseHeaders.get(CorsConnector.AC_ALLOW_ORIGIN_KEY));
Expand All @@ -90,7 +89,7 @@ public void shouldAllowGetWithAllowedOrigin() {
allowOrigins.add("http://example.com");

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertEquals("http://example.com", responseHeaders.get(CorsConnector.AC_ALLOW_ORIGIN_KEY));
Expand Down Expand Up @@ -139,7 +138,7 @@ public void shouldInsertHeadersInExposeList() {
setHost("http://wibble.com");

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertEquals("Vindolanda, Lindisfarne",
Expand All @@ -159,7 +158,7 @@ public void shouldEchoMatchingOrigin() {
setHost("philosopher");

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertEquals("russell", responseHeaders.get(CorsConnector.AC_ALLOW_ORIGIN_KEY));
Expand All @@ -178,7 +177,7 @@ public void shouldAllowCredentialsIfSet() {
config.setAllowCredentials(true);

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
Assert.assertEquals("true", responseHeaders.get(CorsConnector.AC_ALLOW_CREDENTIALS_KEY));
Expand All @@ -197,7 +196,7 @@ public void shouldNotSetCredentialsHeaderIfUnset() {
config.setAllowCredentials(false);

connector = new CorsConnector(request, config, failureFactory);
Map<String, String> responseHeaders = connector.getResponseHeaders();
HeaderMap responseHeaders = connector.getResponseHeaders();

Assert.assertTrue(!connector.isFailure());
// Header should not be set at all if allowCredentials is false.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,85 +15,84 @@
*/
package io.apiman.plugins.cors_policy;

import static org.mockito.BDDMockito.*;
import static org.mockito.BDDMockito.given;

import java.util.Map;
import java.util.Set;

import io.apiman.gateway.engine.beans.HeaderHashMap;
import io.apiman.gateway.engine.beans.ApiRequest;
import io.apiman.gateway.engine.beans.PolicyFailure;
import io.apiman.gateway.engine.beans.PolicyFailureType;
import io.apiman.gateway.engine.beans.ApiRequest;
import io.apiman.gateway.engine.beans.util.HeaderMap;
import io.apiman.gateway.engine.components.IPolicyFailureFactoryComponent;

import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.junit.Before;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

/**
* Common test base
*
*
* @author Marc Savy {@literal <msavy@redhat.com>}
*/
@SuppressWarnings("nls")
public class CorsConnectorTestBase {

protected IPolicyFailureFactoryComponent failureFactory = new IPolicyFailureFactoryComponent() {

@Override
public PolicyFailure createFailure(PolicyFailureType type, int failureCode, String message) {
return new PolicyFailure(type, failureCode, message);
}
};

@Mock
protected ApiRequest request;
protected CorsConfigBean config;
protected CorsConnector connector;

protected Set<String> allowHeaders;
protected Set<String> allowMethods;
protected Set<String> allowOrigins;
protected Set<String> exposeHeaders;
protected Map<String, String> requestHeaders = new HeaderHashMap();

protected HeaderMap requestHeaders = new HeaderMap();

@Before
public void before() {
MockitoAnnotations.initMocks(this);

config = new CorsConfigBean();

allowHeaders = config.getAllowHeaders();
allowMethods = config.getAllowMethods();
allowOrigins = config.getAllowOrigin();
exposeHeaders = config.getExposeHeaders();

// Match defaults in json-schema
config.setAllowCredentials(false);
config.setErrorOnCorsFailure(true);
config.setMaxAge(0);

given(request.getHeaders()).willReturn(requestHeaders);
}

protected void setOrigin(String origin) {
requestHeaders.put(CorsConnector.ORIGIN_KEY, origin);
}

protected void setHost(String host) {
requestHeaders.put(CorsConnector.HOST_KEY, host);
}

protected void setContentType(String type) {
requestHeaders.put(CorsConnector.CONTENT_TYPE, type);
}

protected void setRequestMethods(String... methods) {
requestHeaders.put(CorsConnector.AC_REQUEST_METHOD_KEY, StringUtils.join(methods, ", "));
}

protected void setRequestHeaders(String... headers) {
requestHeaders.put(CorsConnector.AC_REQUEST_HEADERS_KEY, StringUtils.join(headers, ", "));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@
*/
package io.apiman.plugins.httpsecuritypolicy;

import java.util.Map;

import io.apiman.gateway.engine.beans.ApiRequest;
import io.apiman.gateway.engine.beans.ApiResponse;
import io.apiman.gateway.engine.beans.util.HeaderMap;
import io.apiman.gateway.engine.policies.AbstractMappedPolicy;
import io.apiman.gateway.engine.policy.IPolicyChain;
import io.apiman.gateway.engine.policy.IPolicyContext;
Expand All @@ -29,7 +28,7 @@

/**
* Security-related HTTP headers can be set, such as HSTS, CSP and XSS protection.
*
*
* @author Marc Savy {@literal <msavy@redhat.com>}
*/
public class HttpSecurityPolicy extends AbstractMappedPolicy<HttpSecurityBean> {
Expand All @@ -55,7 +54,7 @@ protected void doApply(ApiResponse response, IPolicyContext context, HttpSecurit
}

@SuppressWarnings("nls")
private void setSecurityHeaders(HttpSecurityBean config, Map<String, String> headers) {
private void setSecurityHeaders(HttpSecurityBean config, HeaderMap headers) {
if (config.getHsts().getEnabled()) {
headers.put("Strict-Transport-Security", config.getHsts().getHeaderValue());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ protected Class<JsonpConfigBean> getConfigurationClass() {
protected void doApply(ApiRequest request, IPolicyContext context, JsonpConfigBean config,
IPolicyChain<ApiRequest> chain) {
String callbackParamName = config.getCallbackParamName();
String callbackFunctionName = request.getQueryParams().remove(callbackParamName);
String callbackFunctionName = request.getQueryParams().get(callbackParamName);
request.getQueryParams().remove(callbackParamName);
if (callbackFunctionName != null) {
context.setAttribute(CALLBACK_FUNCTION_NAME, callbackFunctionName);
}
Expand Down Expand Up @@ -72,7 +73,7 @@ public IReadWriteStream<ApiResponse> getResponseDataHandler(final ApiResponse re

// JSONP responses should have the Content-Type header set to "application/javascript"
httpHeaders.setContentType(APPLICATION_JAVASCRIPT);

// the Content-Length will need to be longer
httpHeaders.incrementContentLength(additionalContentLength);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
package io.apiman.plugins.jsonp_policy.http;

import java.util.Map;
import io.apiman.gateway.engine.beans.util.HeaderMap;

/**
* Utility class to get and set data into headers.
*
*
* @author Alexandre Kieling {@literal <alex.kieling@gmail.com>}
*/
public class HttpHeaders {

private static final String CONTENT_TYPE = "Content-Type"; //$NON-NLS-1$
private static final String CONTENT_LENGTH = "Content-Length"; //$NON-NLS-1$

private final Map<String, String> headers;
private final HeaderMap headers;

/**
* Constructor.
*
*
* @param headers headers map
*/
public HttpHeaders(Map<String, String> headers) {
public HttpHeaders(HeaderMap headers) {
this.headers = headers;
}

/**
* Extract the charset from the Content-Type header. When not present, the default charset is returned.
*
*
* @param defaultCharset the default charset
* @return charset
*/
Expand All @@ -40,7 +40,7 @@ public String getCharsetFromContentType(String defaultCharset) {

/**
* Set the type/subtype value of the Content-Type header.
*
*
* @param typeSubtype the type/subtype value
*/
public void setContentType(String typeSubtype) {
Expand All @@ -55,7 +55,7 @@ public void setContentType(String typeSubtype) {
}

/**
* @param additionalContentLength
* @param additionalContentLength the additional content length
*/
public void incrementContentLength(int additionalContentLength) {
String cl = headers.get(CONTENT_LENGTH);
Expand Down

0 comments on commit b8bd58b

Please sign in to comment.