FileDocCategorySizeDatePackage
RequestServicer.javaAPI DocSun JDK 1.5.0 Example4417Sat Jan 08 15:08:43 GMT 2005None

RequestServicer

public class RequestServicer extends Object implements Runnable
Primary driver class used by blocking Servers to receive, prepare, send, and shutdown requests.
author
Mark Reinhold
author
Brad R. Wetmore
version
1.2, 04/07/26

Fields Summary
private ChannelIO
cio
private static int
created
Constructors Summary
RequestServicer(ChannelIO cio)


      
	this.cio = cio;

	// Simple heartbeat to let user know we're alive.
	synchronized (RequestServicer.class) {
	    created++;
	    if ((created % 50) == 0) {
		System.out.println(".");
		created = 0;
	    } else {
		System.out.print(".");
	    }
	}
    
Methods Summary
Replybuild(Request rq)


	Reply rp = null;
	Request.Action action = rq.action();
	if ((action != Request.Action.GET) &&
		(action != Request.Action.HEAD))
	    rp = new Reply(Reply.Code.METHOD_NOT_ALLOWED,
			   new StringContent(rq.toString()));
	else
	    rp = new Reply(Reply.Code.OK,
			   new FileContent(rq.uri()), action);
	try {
	    rp.prepare();
	} catch (IOException x) {
	    rp.release();
	    rp = new Reply(Reply.Code.NOT_FOUND,
			   new StringContent(x));
	    rp.prepare();
	}
	return rp;
    
java.nio.ByteBufferreceive()


	do {} while (!cio.doHandshake());

	for (;;) {
	    int read = cio.read();
	    ByteBuffer bb = cio.getReadBuf();
	    if ((read < 0) || (Request.isComplete(bb))) {
		bb.flip();
		return bb;
	    }
	}
    
public voidrun()

	try {
	    service();
	} catch (IOException x) {
	    x.printStackTrace();
	}
    
private voidservice()

	Reply rp = null;
	try {
	    ByteBuffer rbb = receive();		// Receive
	    Request rq = null;
	    try {				// Parse
		rq = Request.parse(rbb);
	    } catch (MalformedRequestException x) {
		rp = new Reply(Reply.Code.BAD_REQUEST,
			       new StringContent(x));
	    }
	    if (rp == null) rp = build(rq);	// Build
	    do {} while (rp.send(cio));		// Send
	    do {} while (!cio.shutdown());
	    cio.close();
	    rp.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 (rp != null) {
		rp.release();
	    }
	}