You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2011/09/09 17:22:06 UTC

svn commit: r1167244 - in /jackrabbit/sandbox/microkernel/src/main: java/org/apache/jackrabbit/mk/server/ java/org/apache/jackrabbit/mk/util/ resources/ resources/org/ resources/org/apache/ resources/org/apache/jackrabbit/ resources/org/apache/jackrabb...

Author: dpfister
Date: Fri Sep  9 15:22:05 2011
New Revision: 1167244

URL: http://svn.apache.org/viewvc?rev=1167244&view=rev
Log:
HTTP interface to microkernel

Added:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketConnection.java
      - copied, changed from r1166763, jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketHandler.java
    jackrabbit/sandbox/microkernel/src/main/resources/
    jackrabbit/sandbox/microkernel/src/main/resources/org/
    jackrabbit/sandbox/microkernel/src/main/resources/org/apache/
    jackrabbit/sandbox/microkernel/src/main/resources/org/apache/jackrabbit/
    jackrabbit/sandbox/microkernel/src/main/resources/org/apache/jackrabbit/mk/
    jackrabbit/sandbox/microkernel/src/main/resources/org/apache/jackrabbit/mk/server/
Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/Server.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketHandler.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/Server.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/Server.java?rev=1167244&r1=1167243&r2=1167244&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/Server.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/Server.java Fri Sep  9 15:22:05 2011
@@ -32,14 +32,17 @@ import org.apache.jackrabbit.mk.api.Micr
  */
 public class Server {
 
-    private AtomicReference<MicroKernel> mk;
+    private AtomicReference<MicroKernel> mkref;
+    private MicroKernelServlet mkServlet;
     private AtomicBoolean started = new AtomicBoolean();
     private AtomicBoolean stopped = new AtomicBoolean();
     private ServerSocket ss;
     private ExecutorService es;
     
     public Server(MicroKernel mk) {
-        this.mk = new AtomicReference<MicroKernel>(mk);
+        this.mkref = new AtomicReference<MicroKernel>(mk);
+        
+        mkServlet = new MicroKernelServlet(mkref);
     }
     
     public void start() throws IOException {
@@ -74,17 +77,32 @@ public class Server {
             /* ignore */
         }
         try {
-            new SocketHandler(s).process();
+            new SocketConnection(s, new ServletImpl()).process();
         } catch (IOException e) {
             /* ignore */
         }
     }
     
+    class ServletImpl implements Servlet {
+        
+        private final Servlet fileServlet = new FileServlet();
+
+        public void service(Request request, Response response)
+                throws IOException {
+
+            if (request.getMethod().equals("POST")) {
+                mkServlet.service(request, response);
+            } else {
+                fileServlet.service(request, response);
+            }
+        }
+    }
+    
     public void stop() {
         if (!stopped.compareAndSet(false, true)) {
             return;
         }
-        MicroKernel mk = this.mk.getAndSet(null);
+        MicroKernel mk = mkref.getAndSet(null);
         if (mk != null) {
             mk.dispose();
         }

Copied: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketConnection.java (from r1166763, jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketHandler.java)
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketConnection.java?p2=jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketConnection.java&p1=jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketHandler.java&r1=1166763&r2=1167244&rev=1167244&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketHandler.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/server/SocketConnection.java Fri Sep  9 15:22:05 2011
@@ -18,101 +18,78 @@ package org.apache.jackrabbit.mk.server;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
-import java.io.EOFException;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.Socket;
 
 import org.apache.jackrabbit.mk.util.IOUtils;
 
 /**
- * Socket handler for HTTP requests directed at a server.
+ * Process all HTTP requests on a single socket.
  */
-class SocketHandler {
+class SocketConnection {
 
     private final Socket sock;
-    private boolean keepAlive;
-    private BufferedInputStream in;
-    private BufferedOutputStream out;
-    private int sc;
-    private String ctype;
-    private StringBuilder body;
-    
-    public SocketHandler(Socket sock) {
+    private final Servlet servlet;
+    private InputStream sockIn;
+    private OutputStream sockOut;
+
+    /**
+     * Create a new instance of this class.
+     * 
+     * @param sock socket
+     * @param servlet servlet to invoke for incoming requests
+     */
+    public SocketConnection(Socket sock, Servlet servlet) {
         this.sock = sock;
+        this.servlet = servlet;
     }
     
+    /**
+     * Process all requests on a single socket.
+     * 
+     * @throws IOException if an I/O error occurs
+     */
     public void process() throws IOException {
-        in = new BufferedInputStream(sock.getInputStream());
-        out = new BufferedOutputStream(sock.getOutputStream());
-        body = new StringBuilder();
-        
-        do {
-            String requestLine = readLine();
-            for (;;) {
-                String header = readLine();
-                if (header.length() == 0) {
-                    break;
-                }
-            }
-            try {
-                // TODO handle
-                
-                sendNotFound();
-            } finally {
-                sendHeaders();
-            }
+        try { 
+            sockIn = new BufferedInputStream(sock.getInputStream());
+            sockOut = new BufferedOutputStream(sock.getOutputStream());
             
-        } while (keepAlive);
-        
-        IOUtils.closeQuietly(out);
-        IOUtils.closeQuietly(in);
-        IOUtils.closeQuietly(sock);
-    }
-    
-    private String readLine() throws IOException {
-        StringBuilder line = new StringBuilder(128);
+            do {
+                process1();
+                
+            } while (false /* TODO: check for keep-alive */);
         
-        for (;;) {
-            int c = in.read();
-            switch (c) {
-            case '\r':
-                break;
-            case '\n':
-                return line.toString();
-            case -1:
-                throw new EOFException();
-            default:
-                line.append((char) c);
-            }
+        }  finally {
+            IOUtils.closeQuietly(sockOut);
+            IOUtils.closeQuietly(sockIn);
+            IOUtils.closeQuietly(sock);
         }
     }
     
-    private void sendNotFound() throws IOException {
-        sc = 404;
-
-        body.append("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">" +
-                  "<html><head>" +
-                  "<title>404 Not Found</title>" +
-                  "</head><body>" +
-                  "<h1>Not Found</h1>" +
-                  "<p>The requested URL /test.html was not found on this server.</p>" +
-                  "</body></html>");
-    }
-    
-    private void sendHeaders() throws IOException {
-        String msg = (sc == 404 ? "Not found" : "OK");
+    /**
+     * Process a single request.
+     * 
+     * @throws IOException if an I/O error occurs
+     */
+    private void process1() throws IOException {
+        Request request = null;
+        Response response = new Response(sockOut);
         
-        writeLine(String.format("HTTP/1.1 %d %s", sc, msg));
-        writeLine(String.format("Content-Length: %d", body.length()));
-        if (!keepAlive) {
-            writeLine("Connection: Close");
+        try {
+            request = Request.parse(sockIn);
+            if (request == null) {
+                response.setStatusCode(400);
+            } else {
+                servlet.service(request, response);
+            }
+        } finally {
+            if (request != null) {
+                request.finish();
+            }
+            response.finish();
         }
-        writeLine("");
-        out.write(body.toString().getBytes());
     }
     
-    private void writeLine(String s) throws IOException {
-        out.write(s.getBytes());
-        out.write("\r\n".getBytes());
-    }
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java?rev=1167244&r1=1167243&r2=1167244&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java Fri Sep  9 15:22:05 2011
@@ -274,4 +274,28 @@ public class IOUtils {
             }
         }
     }
+    
+    /**
+     * Copy bytes from an <code>InputStream</code> to an
+     * <code>OutputStream</code>.
+     * <p>
+     * This method buffers the input internally, so there is no need to use a
+     * <code>BufferedInputStream</code>.
+     * 
+     * @param input  the <code>InputStream</code> to read from
+     * @param output  the <code>OutputStream</code> to write to
+     * @return the number of bytes copied
+     * @throws IOException if an I/O error occurs
+     */
+    public static long copy(InputStream input, OutputStream output)
+            throws IOException {
+        byte[] buffer = new byte[4096];
+        long count = 0;
+        int n = 0;
+        while (-1 != (n = input.read(buffer))) {
+            output.write(buffer, 0, n);
+            count += n;
+        }
+        return count;
+    }
 }