RequestHandlerpublic class RequestHandler extends Object implements HandlerPrimary driver class used by non-blocking Servers to receive,
prepare, send, and shutdown requests. |
Fields Summary |
---|
private ChannelIO | cio | private ByteBuffer | rbb | private boolean | requestReceived | private Request | request | private Reply | reply | private static int | created |
Constructors Summary |
---|
RequestHandler(ChannelIO cio)
this.cio = cio;
// Simple heartbeat to let user know we're alive.
synchronized (RequestHandler.class) {
created++;
if ((created % 50) == 0) {
System.out.println(".");
created = 0;
} else {
System.out.print(".");
}
}
|
Methods Summary |
---|
private void | build()
Request.Action action = request.action();
if ((action != Request.Action.GET) &&
(action != Request.Action.HEAD)) {
reply = new Reply(Reply.Code.METHOD_NOT_ALLOWED,
new StringContent(request.toString()));
}
reply = new Reply(Reply.Code.OK,
new FileContent(request.uri()), action);
| public void | handle(java.nio.channels.SelectionKey sk)
try {
if (request == null) {
if (!receive(sk))
return;
rbb.flip();
if (parse())
build();
try {
reply.prepare();
} catch (IOException x) {
reply.release();
reply = new Reply(Reply.Code.NOT_FOUND,
new StringContent(x));
reply.prepare();
}
if (send()) {
// More bytes remain to be written
sk.interestOps(SelectionKey.OP_WRITE);
} else {
// Reply completely written; we're done
if (cio.shutdown()) {
cio.close();
reply.release();
}
}
} else {
if (!send()) { // Should be rp.send()
if (cio.shutdown()) {
cio.close();
reply.release();
}
}
}
} catch (IOException x) {
String m = x.getMessage();
if (!m.equals("Broken pipe") &&
!m.equals("Connection reset by peer")) {
System.err.println("RequestHandler: " + x.toString());
}
try {
/*
* We had a failure here, so we'll try to be nice
* before closing down and send off a close_notify,
* but if we can't get the message off with one try,
* we'll just shutdown.
*/
cio.shutdown();
} catch (IOException e) {
// ignore
}
cio.close();
if (reply != null) {
reply.release();
}
}
| private boolean | parse()
try {
request = Request.parse(rbb);
return true;
} catch (MalformedRequestException x) {
reply = new Reply(Reply.Code.BAD_REQUEST,
new StringContent(x));
}
return false;
| private boolean | receive(java.nio.channels.SelectionKey sk)
ByteBuffer tmp = null;
if (requestReceived) {
return true;
}
if (!cio.doHandshake(sk)) {
return false;
}
if ((cio.read() < 0) || Request.isComplete(cio.getReadBuf())) {
rbb = cio.getReadBuf();
return (requestReceived = true);
}
return false;
| private boolean | send()
try {
return reply.send(cio);
} catch (IOException x) {
if (x.getMessage().startsWith("Resource temporarily")) {
System.err.println("## RTA");
return true;
}
throw x;
}
|
|