Fixed some event-server channel-transfer bugs.
[jagi.git] / src / jagi / scgi / EventServer.java
index 1a6bc2a..8218973 100644 (file)
@@ -21,11 +21,6 @@ public class EventServer implements Runnable {
                                                                    tgt -> new Thread(tgt, "Request handler thread"));
 
     public EventServer(ServerSocketChannel sk, Function handler) {
-       try {
-           sk.configureBlocking(false);
-       } catch(IOException e) {
-           throw(new RuntimeException(e));
-       }
        this.sk = sk;
        this.handler = handler;
     }
@@ -120,7 +115,7 @@ public class EventServer implements Runnable {
 
        public void handle(int events) throws IOException {
            if(!eof && (buf.remaining() == 0)) {
-               buf.rewind();
+               buf.clear();
                while(buf.remaining() > 0) {
                    if(in.read(buf) < 0)
                        break;
@@ -173,7 +168,7 @@ public class EventServer implements Runnable {
        public void handle(int events) throws IOException {
            double now = Driver.current().time();
            if((events & SelectionKey.OP_READ) != 0) {
-               buf.rewind();
+               buf.clear();
                if(buf.remaining() > max - cur)
                    buf.limit(buf.position() + (int)Math.min(max - cur, Integer.MAX_VALUE));
                int rv = sk.read(buf);
@@ -181,7 +176,8 @@ public class EventServer implements Runnable {
                    eof = true;
                } else if(rv > 0) {
                    lastread = now;
-                   cur += rv;
+                   if((cur += rv) >= max)
+                       eof = true;
                }
                buf.flip();
                while(buf.remaining() > 0)
@@ -339,6 +335,7 @@ public class EventServer implements Runnable {
        int headlen = 0;
        ByteBuffer head = null;
        Map<Object, Object> env = null;
+       Request req = null;
 
        Client(SocketChannel sk) {
            this.sk = sk;
@@ -406,8 +403,7 @@ public class EventServer implements Runnable {
            if((events & SelectionKey.OP_READ) != 0) {
                if((env == null) && !readhead())
                    return;
-               Request req = new Request(env, sk);
-               submit(() -> EventServer.this.handle(req, handler));
+               req = new Request(env, sk);
                handoff = true;
            }
            if(Driver.current().time() > (lastread + timeout))
@@ -415,6 +411,8 @@ public class EventServer implements Runnable {
        }
 
        public void close() {
+           if(req != null)
+               submit(() -> EventServer.this.handle(req, handler));
            if(!handoff) {
                try {
                    sk.close();
@@ -431,11 +429,8 @@ public class EventServer implements Runnable {
        public int events() {return(SelectionKey.OP_ACCEPT);}
 
        public void handle(int events) throws IOException {
-           if((events & SelectionKey.OP_ACCEPT) != 0) {
-               SocketChannel cl = sk.accept();
-               cl.configureBlocking(false);
-               Driver.current().add(new Client(cl));
-           }
+           if((events & SelectionKey.OP_ACCEPT) != 0)
+               Driver.current().add(new Client(sk.accept()));
        }
 
        public void close() {