use of org.apache.http.impl.io.SessionInputBufferImpl in project indy by Commonjava.
the class ProxyRequestReader method handleEvent.
// TODO: May need to tune this to preserve request body.
// TODO: NONE of the request headers (except authorization) are passed through!
@Override
public void handleEvent(final ConduitStreamSourceChannel channel) {
boolean sendResponse = false;
try {
final int read = doRead(channel);
logger.debug("Request in progress is:\n\n'{}'", new String(req.toByteArray()));
if (read < 0 || headDone) {
logger.debug("request done. parsing.");
MessageConstraints mc = MessageConstraints.DEFAULT;
SessionInputBufferImpl inbuf = new SessionInputBufferImpl(new HttpTransportMetricsImpl(), 1024);
HttpRequestFactory requestFactory = new DefaultHttpRequestFactory();
LineParser lp = new BasicLineParser();
DefaultHttpRequestParser requestParser = new DefaultHttpRequestParser(inbuf, lp, requestFactory, mc);
inbuf.bind(new ByteArrayInputStream(req.toByteArray()));
try {
logger.debug("Passing parsed http request off to response writer.");
HttpRequest request = requestParser.parse();
logger.debug("Request contains {} header: '{}'", ApplicationHeader.authorization.key(), request.getHeaders(ApplicationHeader.authorization.key()));
writer.setHttpRequest(request);
sendResponse = true;
} catch (ConnectionClosedException e) {
logger.warn("Client closed connection. Aborting proxy request.");
sendResponse = false;
channel.resumeReads();
} catch (HttpException e) {
logger.error("Failed to parse http request: " + e.getMessage(), e);
writer.setError(e);
}
} else {
logger.debug("request not finished. Pausing until more reads are available.'");
channel.resumeReads();
}
} catch (final IOException e) {
writer.setError(e);
sendResponse = true;
}
if (sendResponse) {
sinkChannel.resumeWrites();
try {
channel.shutdownReads();
} catch (final IOException e) {
logger.debug("failed to shutdown proxy request reads.", e);
}
// IOUtils.closeQuietly( channel );
}
}
Aggregations