Skip to content

Commit

Permalink
Let Rest.li filters modify request headers
Browse files Browse the repository at this point in the history
RB=430630
R=gogenc,nshankar
A=nshankar
  • Loading branch information
Soojung Ha committed Feb 13, 2015
1 parent 34b0c4f commit b7afbf2
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 5 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG
@@ -1,6 +1,7 @@
2.2.4
-----

(RB=430630)
Let Rest.li filters modify request headers.

2.2.3
-----
Expand Down
Expand Up @@ -9,8 +9,10 @@
"name" : "exceptions3Id",
"type" : "long"
},
"supports" : [ "get", "update" ],
"supports" : [ "create", "get", "update" ],
"methods" : [ {
"method" : "create"
}, {
"method" : "get"
}, {
"method" : "update"
Expand Down
Expand Up @@ -32,8 +32,10 @@
"name" : "exceptions3Id",
"type" : "long"
},
"supports" : [ "get", "update" ],
"supports" : [ "create", "get", "update" ],
"methods" : [ {
"method" : "create"
}, {
"method" : "get"
}, {
"method" : "update"
Expand Down
Expand Up @@ -17,17 +17,27 @@
package com.linkedin.restli.examples.greetings.server;


import com.linkedin.r2.transport.http.common.HttpConstants;
import com.linkedin.restli.common.HttpStatus;
import com.linkedin.restli.examples.greetings.api.Greeting;
import com.linkedin.restli.server.CreateResponse;
import com.linkedin.restli.server.RestLiServiceException;
import com.linkedin.restli.server.UpdateResponse;
import com.linkedin.restli.server.annotations.RestLiCollection;
import com.linkedin.restli.server.resources.CollectionResourceTemplate;

import java.util.Map;


@RestLiCollection(name = "exceptions3",
namespace = "com.linkedin.restli.examples.greetings.client")
public class ExceptionsResource3 extends CollectionResourceTemplate<Long, Greeting>
{
public static final String TEST1_HEADER = "Test1-Header";
public static final String TEST2_HEADER = "Test2-Header";
public static final String TEST1_VALUE = "Test1-Value";
public static final String TEST2_VALUE = "Test2-Value";

@Override
public Greeting get(Long key)
{
Expand All @@ -39,4 +49,17 @@ public UpdateResponse update(final Long key, final Greeting entity)
{
return new UpdateResponse(HttpStatus.S_404_NOT_FOUND);
}

@Override
public CreateResponse create(Greeting greeting)
{
Map<String, String> requestHeaders = getContext().getRequestHeaders();
if (!requestHeaders.get(TEST1_HEADER).equals(TEST1_VALUE)
|| !requestHeaders.get(TEST2_HEADER).equals(TEST2_VALUE))
{
throw new RestLiServiceException(HttpStatus.S_500_INTERNAL_SERVER_ERROR,
"Request headers are not modified from filter.");
}
return new CreateResponse(1234L);
}
}
Expand Up @@ -21,6 +21,7 @@
import com.linkedin.r2.transport.common.Client;
import com.linkedin.r2.transport.common.bridge.client.TransportClientAdapter;
import com.linkedin.r2.transport.http.client.HttpClientFactory;
import com.linkedin.r2.transport.http.common.HttpConstants;
import com.linkedin.restli.client.ErrorHandlingBehavior;
import com.linkedin.restli.client.Request;
import com.linkedin.restli.client.Response;
Expand All @@ -29,13 +30,19 @@
import com.linkedin.restli.client.RestLiResponseException;
import com.linkedin.restli.common.EmptyRecord;
import com.linkedin.restli.common.HttpStatus;
import com.linkedin.restli.common.IdResponse;
import com.linkedin.restli.examples.greetings.api.Greeting;
import com.linkedin.restli.examples.greetings.api.Tone;
import com.linkedin.restli.examples.greetings.client.Exceptions3Builders;
import com.linkedin.restli.examples.greetings.client.Exceptions3RequestBuilders;
import com.linkedin.restli.examples.greetings.server.ExceptionsResource3;
import com.linkedin.restli.server.filter.FilterRequestContext;
import com.linkedin.restli.server.filter.RequestFilter;
import com.linkedin.restli.test.util.RootBuilderWrapper;

import java.util.Arrays;
import java.util.Collections;
import java.util.Map;

import org.testng.Assert;
import org.testng.annotations.AfterClass;
Expand All @@ -53,7 +60,31 @@ public class TestExceptionsResource3 extends RestLiIntegrationTest
@BeforeClass
public void initClass() throws Exception
{
super.init();
class ChangeHeaderFilter1 implements RequestFilter
{
@Override
public void onRequest(FilterRequestContext requestContext)
{
Map<String, String> headers = requestContext.getRequestHeaders();
// Add new headers
headers.put(ExceptionsResource3.TEST1_HEADER, ExceptionsResource3.TEST1_VALUE);
headers.put(ExceptionsResource3.TEST2_HEADER, ExceptionsResource3.TEST1_VALUE);
}
}

class ChangeHeaderFilter2 implements RequestFilter
{
@Override
public void onRequest(FilterRequestContext requestContext)
{
Map<String, String> headers = requestContext.getRequestHeaders();
Assert.assertEquals(headers.get(ExceptionsResource3.TEST1_HEADER), ExceptionsResource3.TEST1_VALUE);
Assert.assertEquals(headers.get(ExceptionsResource3.TEST2_HEADER), ExceptionsResource3.TEST1_VALUE);
// Modify existing header
headers.put(ExceptionsResource3.TEST2_HEADER, ExceptionsResource3.TEST2_VALUE);
}
}
super.init(Arrays.asList(new ChangeHeaderFilter1(), new ChangeHeaderFilter2()), null);
}

@AfterClass
Expand All @@ -62,6 +93,16 @@ public void shutDown() throws Exception
super.shutdown();
}

// Test that Rest.li request filters can change request headers
@Test
public void testChangeRequestHeaderFromFilter() throws RemoteInvocationException
{
Greeting greeting = new Greeting().setId(1L).setMessage("Hello").setTone(Tone.FRIENDLY);
Request<IdResponse<Long>> createRequest = new Exceptions3RequestBuilders().create().input(greeting).build();
Response<IdResponse<Long>> response = REST_CLIENT.sendRequest(createRequest).getResponse();
Assert.assertEquals(response.getStatus(), HttpStatus.S_201_CREATED.getCode());
}

@Test(dataProvider = com.linkedin.restli.internal.common.TestConstants.RESTLI_PROTOCOL_1_2_PREFIX + "exceptionHandlingModesDataProvider")
public void testGet404(boolean explicit, ErrorHandlingBehavior errorHandlingBehavior, RootBuilderWrapper<Long, Greeting> builders) throws RemoteInvocationException
{
Expand Down
Expand Up @@ -57,6 +57,7 @@ public class ResourceContextImpl implements ServerResourceContext
private final MutablePathKeys _pathKeys;
private final RestRequest _request;
private final DataMap _parameters;
private final Map<String, String> _requestHeaders;
private final Map<String, String> _responseHeaders;
private final Map<Object, RestLiServiceException> _batchKeyErrors;
private final RequestContext _requestContext;
Expand Down Expand Up @@ -107,6 +108,7 @@ public ResourceContextImpl(final MutablePathKeys pathKeys,
{
_pathKeys = pathKeys;
_request = request;
_requestHeaders = new HashMap<String, String>(request.getHeaders());
_requestContext = requestContext;

_protocolVersion = ProtocolVersionUtil.extractProtocolVersion(request.getHeaders());
Expand Down Expand Up @@ -291,7 +293,7 @@ public boolean hasParameter(final String key)
@Override
public Map<String, String> getRequestHeaders()
{
return _request.getHeaders();
return _requestHeaders;
}

/**
Expand Down

0 comments on commit b7afbf2

Please sign in to comment.