use of com.linkedin.r2.message.Request in project rest.li by linkedin.
the class ClientStreamCompressionFilter method onStreamRequest.
/**
* Optionally compresses outgoing Stream requests
* */
public void onStreamRequest(StreamRequest req, final RequestContext requestContext, final Map<String, String> wireAttrs, final NextFilter<StreamRequest, StreamResponse> nextFilter) {
//Set accepted encoding for compressed response
String operation = (String) requestContext.getLocalAttr(R2Constants.OPERATION);
if (!_acceptEncodingHeader.isEmpty() && _helper.shouldCompressResponseForOperation(operation)) {
CompressionOption responseCompressionOverride = (CompressionOption) requestContext.getLocalAttr(R2Constants.RESPONSE_COMPRESSION_OVERRIDE);
req = addResponseCompressionHeaders(responseCompressionOverride, req);
}
if (_requestContentEncoding != StreamEncodingType.IDENTITY) {
final StreamRequest request = req;
final StreamingCompressor compressor = _requestContentEncoding.getCompressor(_executor);
CompressionOption option = (CompressionOption) requestContext.getLocalAttr(R2Constants.REQUEST_COMPRESSION_OVERRIDE);
if (option == null || option != CompressionOption.FORCE_OFF) {
final int threshold = option == CompressionOption.FORCE_ON ? 0 : _requestCompressionConfig.getCompressionThreshold();
PartialReader reader = new PartialReader(threshold, new Callback<EntityStream[]>() {
@Override
public void onError(Throwable ex) {
nextFilter.onError(ex, requestContext, wireAttrs);
}
@Override
public void onSuccess(EntityStream[] result) {
if (result.length == 1) {
StreamRequest uncompressedRequest = request.builder().build(result[0]);
nextFilter.onRequest(uncompressedRequest, requestContext, wireAttrs);
} else {
StreamRequestBuilder builder = request.builder();
EntityStream compressedStream = compressor.deflate(EntityStreams.newEntityStream(new CompositeWriter(result)));
Map<String, String> headers = stripHeaders(builder.getHeaders(), HttpConstants.CONTENT_LENGTH);
StreamRequest compressedRequest = builder.setHeaders(headers).setHeader(HttpConstants.CONTENT_ENCODING, compressor.getContentEncodingName()).build(compressedStream);
nextFilter.onRequest(compressedRequest, requestContext, wireAttrs);
}
}
});
req.getEntityStream().setReader(reader);
return;
}
}
nextFilter.onRequest(req, requestContext, wireAttrs);
}
use of com.linkedin.r2.message.Request in project rest.li by linkedin.
the class TestQueryTunnel method testTunneledLongQuery.
@Test
public void testTunneledLongQuery() throws Exception {
// Just test a true long query, to go beyond the simple 0 threshold tests above
String query = "q=queryString";
for (int i = 0; i < 10000; i++) query += "&a=" + i;
RestRequest request = new RestRequestBuilder(new URI("http://localhost:7279?" + query)).setMethod("GET").build();
// Set threshold < query length
RestRequest encoded = encode(request, query.length() - 1);
Assert.assertEquals(encoded.getMethod(), "POST");
Assert.assertEquals(encoded.getURI().toString(), "http://localhost:7279");
Assert.assertTrue(encoded.getEntity().length() == query.length());
Assert.assertEquals(encoded.getHeader("Content-Type"), "application/x-www-form-urlencoded");
Assert.assertEquals(encoded.getHeader("Content-Length"), Integer.toString(encoded.getEntity().length()));
RequestContext requestContext = new RequestContext();
RestRequest decoded = decode(encoded, requestContext);
Assert.assertEquals(decoded.getURI(), request.getURI());
Assert.assertEquals(decoded.getMethod(), "GET");
Assert.assertTrue((Boolean) requestContext.getLocalAttr(R2Constants.IS_QUERY_TUNNELED));
}
use of com.linkedin.r2.message.Request in project rest.li by linkedin.
the class TestQueryTunnel method testModifiedQuery.
@Test
public void testModifiedQuery() throws Exception {
// Test case where someone has added a query param to the request underneath us
// This test is motivated by some test frameworks that add params to queries in EI
String query = "q=queryString&a=1&b=2";
RestRequest request = new RestRequestBuilder(new URI("http://localhost:7279?" + query)).setMethod("GET").build();
// Set threshold < query length
RestRequest encoded = encode(request, query.length() - 1);
Assert.assertEquals(encoded.getMethod(), "POST");
Assert.assertEquals(encoded.getURI().toString(), "http://localhost:7279");
Assert.assertTrue(encoded.getEntity().length() == query.length());
Assert.assertEquals(encoded.getHeader("Content-Type"), "application/x-www-form-urlencoded");
RestRequestBuilder rb = encoded.builder().setURI(new URI(encoded.getURI().toString() + "?uh=f"));
RestRequest modified = rb.build();
RequestContext requestContext = new RequestContext();
RestRequest decoded = decode(modified, requestContext);
Assert.assertEquals(decoded.getURI().toString(), "http://localhost:7279?uh=f&" + query);
Assert.assertTrue((Boolean) requestContext.getLocalAttr(R2Constants.IS_QUERY_TUNNELED));
}
use of com.linkedin.r2.message.Request in project rest.li by linkedin.
the class TestQueryTunnel method testModifiedQuestionQuery.
@Test
public void testModifiedQuestionQuery() throws Exception {
// Test case where someone has added a "?" underneath us with no args - make sure
// we re-append the query correctly
// This test is motivated by some test frameworks that add params to queries in EI
String query = "q=queryString&a=1&b=2";
RestRequest request = new RestRequestBuilder(new URI("http://localhost:7279?" + query)).setMethod("GET").build();
// Set threshold < query length
RestRequest encoded = encode(request, query.length() - 1);
Assert.assertEquals(encoded.getMethod(), "POST");
Assert.assertEquals(encoded.getURI().toString(), "http://localhost:7279");
Assert.assertTrue(encoded.getEntity().length() == query.length());
Assert.assertEquals(encoded.getHeader("Content-Type"), "application/x-www-form-urlencoded");
RestRequestBuilder rb = encoded.builder().setURI(new URI(encoded.getURI().toString() + "?"));
RestRequest modified = rb.build();
RequestContext requestContext = new RequestContext();
RestRequest decoded = decode(modified, requestContext);
Assert.assertEquals(decoded.getURI().toString(), "http://localhost:7279?" + query);
Assert.assertTrue((Boolean) requestContext.getLocalAttr(R2Constants.IS_QUERY_TUNNELED));
}
use of com.linkedin.r2.message.Request in project rest.li by linkedin.
the class TestQueryTunnel method testTunneledHandConstructedOverride.
@Test
public void testTunneledHandConstructedOverride() throws Exception {
// Example of a hand-constructed "encoded" request
RestRequest request = new RestRequestBuilder(new URI("http://localhost:7279")).setMethod("POST").setHeader("X-HTTP-Method-Override", "GET").setHeader("Content-Type", "application/x-www-form-urlencoded").setEntity(new String("q=123").getBytes()).build();
RequestContext requestContext = new RequestContext();
RestRequest decoded = decode(request, requestContext);
Assert.assertEquals(decoded.getURI().toString(), "http://localhost:7279?q=123");
Assert.assertEquals(decoded.getMethod(), "GET");
Assert.assertTrue((Boolean) requestContext.getLocalAttr(R2Constants.IS_QUERY_TUNNELED));
}
Aggregations