use of org.jboss.netty.handler.codec.http.HttpRequest in project databus by linkedin.
the class DatabusRequestExecutionHandler method messageReceived.
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
if (e.getMessage() instanceof HttpRequest) {
_httpRequest = (HttpRequest) e.getMessage();
ctx.sendUpstream(e);
}
if (e.getMessage() instanceof DatabusRequest) {
_dbusRequest = (DatabusRequest) e.getMessage();
// If there is a physical partition stashed away, then restore it into the request now.
if (ctx.getAttachment() != null && ctx.getAttachment() instanceof PhysicalPartition) {
_dbusRequest.setCursorPartition((PhysicalPartition) (ctx.getAttachment()));
}
/*NettyStats nettyStats = _configManager.getNettyStats();
boolean nettyStatsEnabled = nettyStats.isEnabled();
CallCompletion callCompletion = nettyStatsEnabled ?
nettyStats.getRequestHandler_writeResponse().startCall() :
null;
CallCompletion processRequestCompletion = null;*/
try {
if (LOG.isDebugEnabled()) {
LOG.debug("Creating response for command [" + _dbusRequest.getId() + "] " + _dbusRequest.getName());
}
// Decide whether to close the connection or not.
boolean keepAlive = isKeepAlive(_httpRequest);
HttpResponse response = generateEmptyResponse();
if (LOG.isDebugEnabled()) {
// We are debugging -- let's add some more info to the response
response.addHeader(DatabusHttpHeaders.DATABUS_REQUEST_ID_HEADER, Long.toString(_dbusRequest.getId()));
}
// Write the response.
ChunkedBodyWritableByteChannel responseChannel = null;
try {
responseChannel = new ChunkedBodyWritableByteChannel(e.getChannel(), response);
_dbusRequest.setResponseContent(responseChannel);
if (LOG.isDebugEnabled()) {
LOG.debug("About to run command [" + _dbusRequest.getId() + "] " + _dbusRequest.getName());
}
// FIXME DDS-305: Rework the netty stats collector to use event-based stats aggregation
/*if (nettyStatsEnabled)
{
processRequestCompletion = nettyStats.getRequestHandler_processRequest().startCall();
}*/
Future<DatabusRequest> responseFuture = _processorRegistry.run(_dbusRequest);
ServerContainer.RuntimeConfig config = _dbusRequest.getConfig();
int timeoutMs = config.getRequestProcessingBudgetMs();
boolean done = responseFuture.isDone();
while (!done) {
try {
responseFuture.get(timeoutMs, TimeUnit.MILLISECONDS);
done = true;
ctx.setAttachment(_dbusRequest.getCursorPartition());
} catch (InterruptedException ie) {
done = responseFuture.isDone();
} catch (Exception ex) {
done = true;
_dbusRequest.setError(ex);
// On any error, clear any context saved. We will start afresh in a new request.
ctx.setAttachment(null);
// FIXME DDS-305: Rework the netty stats collector to use event-based stats aggregation
/*if (null != processRequestCompletion)
{
processRequestCompletion.endCallWithError(ex);
processRequestCompletion = null;
}*/
}
}
} finally {
if (null != responseChannel) {
if (LOG.isDebugEnabled()) {
// Add some more debugging info
long curTimeMs = System.currentTimeMillis();
responseChannel.addMetadata(DatabusHttpHeaders.DATABUS_REQUEST_LATENCY_HEADER, Long.toString(curTimeMs - _dbusRequest.getCreateTimestampMs()));
}
responseChannel.close();
}
if (null != _dbusRequest.getResponseThrowable()) {
ContainerStatisticsCollector statsCollector = _serverContainer.getContainerStatsCollector();
if (null != statsCollector) {
statsCollector.registerContainerError(_dbusRequest.getResponseThrowable());
}
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("Done runing command [" + _dbusRequest.getId() + "] " + _dbusRequest.getName());
}
// Close the non-keep-alive or hard-failed connection after the write operation is done.
if (!keepAlive || null == responseChannel) {
e.getChannel().close();
}
// FIXME DDS-305: Rework the netty stats collector to use event-based stats aggregation
/*if (null != callCompletion)
{
callCompletion.endCall();
}*/
} catch (RuntimeException ex) {
LOG.error("HttpRequestHandler.writeResponse error", ex);
// FIXME DDS-305: Rework the netty stats collector to use event-based stats aggregation
/*if (null != callCompletion)
{
callCompletion.endCallWithError(ex);
}*/
ContainerStatisticsCollector statsCollector = _serverContainer.getContainerStatsCollector();
if (null != statsCollector)
statsCollector.registerContainerError(ex);
}
} else {
// Pass on everything else
ctx.sendUpstream(e);
}
}
use of org.jboss.netty.handler.codec.http.HttpRequest in project databus by linkedin.
the class DummyHttpRequestHandler method testWriteOneChunk.
@Test
public void testWriteOneChunk() {
LOG.info("Start: Testing headers with one chunk");
setupClient();
String chunk1 = "hello";
ArrayList<byte[]> chunks = new ArrayList<byte[]>();
chunks.add(chunk1.getBytes(Charset.defaultCharset()));
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("header1", "value1");
headers.put("header2", "value2");
HashMap<String, String> footers = new HashMap<String, String>();
setupServer(HttpResponseStatus.OK, chunks, headers, footers);
ChannelFuture connectFuture = _clientBootstrap.connect(_serverAddress);
connectFuture.awaitUninterruptibly(1, TimeUnit.SECONDS);
assertTrue("connect succeeded", connectFuture.isSuccess());
HttpRequest request = new DefaultHttpRequest(HTTP_1_1, HttpMethod.GET, "/test");
Channel requestChannel = connectFuture.getChannel();
ChannelFuture writeFuture = requestChannel.write(request);
writeFuture.awaitUninterruptibly(1, TimeUnit.SECONDS);
assertTrue("connect succeeded", writeFuture.isSuccess());
HttpResponse response = _responseHandler.getResponse();
assertEquals("response code", Integer.toString(HttpResponseStatus.OK.getCode()), response.getHeader(ChunkedBodyWritableByteChannel.RESPONSE_CODE_FOOTER_NAME));
assertEquals("Checking header1 value", "value1", response.getHeader("header1"));
assertEquals("Checking header2 value", "value2", response.getHeader("header2"));
byte[] responseBody = _responseHandler.getReceivedBytes();
assertEquals("response length", chunk1.getBytes(Charset.defaultCharset()).length, responseBody.length);
assertTrue("response content", Arrays.equals(chunk1.getBytes(Charset.defaultCharset()), responseBody));
LOG.info("Done: Testing headers with one chunk");
}
use of org.jboss.netty.handler.codec.http.HttpRequest in project databus by linkedin.
the class DummyHttpRequestHandler method testSetResponseCode.
@Test
public void testSetResponseCode() {
LOG.info("Start: Testing response code with headers with empty body");
setupClient();
ArrayList<byte[]> chunks = new ArrayList<byte[]>();
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("header1", "value1");
headers.put("header2", "value2");
HashMap<String, String> footers = new HashMap<String, String>();
setupServer(HttpResponseStatus.BAD_GATEWAY, chunks, headers, footers);
ChannelFuture connectFuture = _clientBootstrap.connect(_serverAddress);
connectFuture.awaitUninterruptibly(1, TimeUnit.SECONDS);
assertTrue("connect succeeded", connectFuture.isSuccess());
HttpRequest request = new DefaultHttpRequest(HTTP_1_1, HttpMethod.GET, "/test");
Channel requestChannel = connectFuture.getChannel();
ChannelFuture writeFuture = requestChannel.write(request);
writeFuture.awaitUninterruptibly(1, TimeUnit.SECONDS);
assertTrue("connect succeeded", writeFuture.isSuccess());
HttpResponse response = _responseHandler.getResponse();
assertEquals("response code", HttpResponseStatus.BAD_GATEWAY, response.getStatus());
assertEquals("Checking header1 value", "value1", response.getHeader("header1"));
assertEquals("Checking header2 value", "value2", response.getHeader("header2"));
assertEquals("Checking header3 value", null, response.getHeader("header3"));
byte[] responseBody = _responseHandler.getReceivedBytes();
assertTrue("empty response", null == responseBody || responseBody.length == 0);
LOG.info("Done: Testing response code with headers with empty body");
}
use of org.jboss.netty.handler.codec.http.HttpRequest in project databus by linkedin.
the class DummyHttpRequestHandler method testWriteHeadersEmptyBody.
@Test
public void testWriteHeadersEmptyBody() {
LOG.info("Start: Testing headers with empty body");
setupClient();
ArrayList<byte[]> chunks = new ArrayList<byte[]>();
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("header1", "value1");
headers.put("header2", "value2");
HashMap<String, String> footers = new HashMap<String, String>();
setupServer(HttpResponseStatus.OK, chunks, headers, footers);
ChannelFuture connectFuture = _clientBootstrap.connect(_serverAddress);
connectFuture.awaitUninterruptibly(1, TimeUnit.SECONDS);
assertTrue("connect succeeded", connectFuture.isSuccess());
HttpRequest request = new DefaultHttpRequest(HTTP_1_1, HttpMethod.GET, "/test");
Channel requestChannel = connectFuture.getChannel();
ChannelFuture writeFuture = requestChannel.write(request);
writeFuture.awaitUninterruptibly(1, TimeUnit.SECONDS);
assertTrue("connect succeeded", writeFuture.isSuccess());
HttpResponse response = _responseHandler.getResponse();
assertEquals("response code", HttpResponseStatus.OK, response.getStatus());
assertEquals("Checking header1 value", "value1", response.getHeader("header1"));
assertEquals("Checking header2 value", "value2", response.getHeader("header2"));
assertEquals("Checking header3 value", null, response.getHeader("header3"));
byte[] responseBody = _responseHandler.getReceivedBytes();
assertTrue("empty response", null == responseBody || responseBody.length == 0);
LOG.info("Done: Testing headers with empty body");
}
use of org.jboss.netty.handler.codec.http.HttpRequest in project databus by linkedin.
the class TestRelayCommandsLocal method testNoDataStreamCommand.
@Test
public void testNoDataStreamCommand() throws Exception {
LOG.debug("\n\nstarting testNoDataStreamCommand()\n");
HttpRequest httpRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/stream?sources=100&size=1000&output=json&checkPoint={\"windowScn\":-1,\"windowOffset\":-1}");
SimpleTestHttpClient httpClient = SimpleTestHttpClient.createLocal(TimeoutPolicy.ALL_TIMEOUTS);
SimpleHttpResponseHandler respHandler = httpClient.sendRequest(_serverAddress, httpRequest);
assertTrue("failed to get a response", respHandler.awaitResponseUninterruptedly(1, TimeUnit.SECONDS));
assertEquals("expected to get empty response", 0, respHandler.getReceivedBytes().length);
HttpResponse respObj = respHandler.getResponse();
assertNull("/stream returned unexpected error", respObj.getHeader(DatabusHttpHeaders.DATABUS_ERROR_CLASS_HEADER));
assertNull("/stream returned unexpected error with cause", respObj.getHeader(DatabusHttpHeaders.DATABUS_ERROR_CAUSE_CLASS_HEADER));
}
Aggregations