You are viewing a plain text version of this content. The canonical link for it is here.
Posted to awf-commits@incubator.apache.org by sl...@apache.org on 2012/02/07 23:38:21 UTC

svn commit: r1241701 - in /incubator/deft/trunk/src: main/java/org/apache/deft/web/ main/java/org/apache/deft/web/handler/ main/java/org/apache/deft/web/http/ main/java/org/apache/deft/web/http/protocol/ test/java/org/apache/deft/web/ test/java/org/apa...

Author: slemesle
Date: Tue Feb  7 23:38:21 2012
New Revision: 1241701

URL: http://svn.apache.org/viewvc?rev=1241701&view=rev
Log:
DEFT-191 - Integrate Continue patch

Added:
    incubator/deft/trunk/src/main/java/org/apache/deft/web/handler/HttpContinueRequestHandler.java
Modified:
    incubator/deft/trunk/src/main/java/org/apache/deft/web/Application.java
    incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpProtocol.java
    incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequest.java
    incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java
    incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpResponseImpl.java
    incubator/deft/trunk/src/main/java/org/apache/deft/web/http/protocol/HttpStatus.java
    incubator/deft/trunk/src/test/java/org/apache/deft/web/DeftSystemTest.java
    incubator/deft/trunk/src/test/java/org/apache/deft/web/http/protocol/HttpStatusTest.java

Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/Application.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/Application.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/Application.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/Application.java Tue Feb  7 23:38:21 2012
@@ -26,6 +26,7 @@ import org.apache.deft.configuration.Con
 import org.apache.deft.util.HttpUtil;
 import org.apache.deft.web.handler.BadRequestRequestHandler;
 import org.apache.deft.web.handler.ForbiddenRequestHandler;
+import org.apache.deft.web.handler.HttpContinueRequestHandler;
 import org.apache.deft.web.handler.NotFoundRequestHandler;
 import org.apache.deft.web.handler.RequestHandler;
 import org.apache.deft.web.handler.RequestHandlerFactory;
@@ -127,6 +128,10 @@ public class Application {
             return ForbiddenRequestHandler.getInstance();
         }
 
+        if (request.expectContinue()) {
+            return HttpContinueRequestHandler.getInstance();
+        }
+
         return rh;
     }
 

Added: incubator/deft/trunk/src/main/java/org/apache/deft/web/handler/HttpContinueRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/handler/HttpContinueRequestHandler.java?rev=1241701&view=auto
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/handler/HttpContinueRequestHandler.java (added)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/handler/HttpContinueRequestHandler.java Tue Feb  7 23:38:21 2012
@@ -0,0 +1,47 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.deft.web.handler;
+
+import org.apache.deft.web.http.HttpRequest;
+import org.apache.deft.web.http.HttpResponse;
+import org.apache.deft.web.http.protocol.HttpStatus;
+
+public class HttpContinueRequestHandler extends RequestHandler {
+
+	private final static HttpContinueRequestHandler instance = new HttpContinueRequestHandler();
+
+	private HttpContinueRequestHandler() {
+	}
+
+	public static final HttpContinueRequestHandler getInstance() {
+		return instance;
+	}
+
+	@Override
+	public void post(HttpRequest request, HttpResponse response) {
+		response.setStatus(HttpStatus.SUCCESS_CONTINUE);
+	}
+
+	@Override
+	public void put(HttpRequest request, HttpResponse response) {
+		response.setStatus(HttpStatus.SUCCESS_CONTINUE);
+	}
+
+}

Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpProtocol.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpProtocol.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpProtocol.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpProtocol.java Tue Feb  7 23:38:21 2012
@@ -19,16 +19,18 @@
  */
 package org.apache.deft.web.http;
 
-import static org.apache.deft.web.http.HttpServerDescriptor.KEEP_ALIVE_TIMEOUT;
-import static org.apache.deft.web.http.HttpServerDescriptor.READ_BUFFER_SIZE;
-
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.*;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.FileChannel;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
 import java.util.Map;
 
+import com.google.common.collect.Maps;
 import org.apache.deft.io.IOHandler;
 import org.apache.deft.io.IOLoop;
 import org.apache.deft.io.buffer.DynamicByteBuffer;
@@ -38,8 +40,8 @@ import org.apache.deft.web.Application;
 import org.apache.deft.web.handler.RequestHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Maps;
+import static org.apache.deft.web.http.HttpServerDescriptor.KEEP_ALIVE_TIMEOUT;
+import static org.apache.deft.web.http.HttpServerDescriptor.READ_BUFFER_SIZE;
 
 public class HttpProtocol implements IOHandler {
 
@@ -88,8 +90,8 @@ public class HttpProtocol implements IOH
 
         // Request is null when End-of-Stream have been reached
         // No need to do more things right now
-        if(request != null){
-
+        if(request != null){        	
+        	logger.debug("received request: \n"+request.toString()); 
             if (request.isKeepAlive()) {
                 ioLoop.addKeepAliveTimeout(clientChannel, Timeout.newKeepAliveTimeout(ioLoop, clientChannel,
                         KEEP_ALIVE_TIMEOUT));
@@ -100,10 +102,9 @@ public class HttpProtocol implements IOH
 
             RequestHandler rh = application.getHandler(request);
             HttpRequestDispatcher.dispatch(rh, request, response);
-
-            // Only close if not async. In that case its up to RH to close it (+
-            // don't close if it's a partial request).
-            if (!rh.isMethodAsynchronous(request.getMethod()) && !(request instanceof PartialHttpRequest)) {
+            
+            // Only close if not async. In that case its up to RH to close it
+            if (!rh.isMethodAsynchronous(request.getMethod()) ) {
                 response.finish();
             }
         }
@@ -266,7 +267,8 @@ public class HttpProtocol implements IOH
         request.setRemotePort(clientChannel.socket().getPort());
         request.setServerHost(clientChannel.socket().getLocalAddress());
         request.setServerPort(clientChannel.socket().getLocalPort());
-        return (request.isFinished() ? request : null);
+        
+        return (request.isFinished() || request.expectContinue() ? request : null);
     }
 
     @Override

Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequest.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequest.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequest.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequest.java Tue Feb  7 23:38:21 2012
@@ -105,7 +105,9 @@ public interface HttpRequest {
     public String getParameter(String name);
 
     /**
-     * TODO: JAVADOC, it's unclear to me (jvermillard)
+     * Returns a map of all parameters where each key is a parameter name,
+     * linked value is a Collection of String containing all known values for the parameter.
+     * When the parameter has no value, the collection will be empty.
      * 
      * @return all the request parameters
      */
@@ -179,5 +181,12 @@ public interface HttpRequest {
      * @return <code>true</code> if keep-alive requested
      */
     public boolean isKeepAlive();
+    
+    /**
+     * Check if the request expect a response with 100 Continue header
+     * 
+     * @return
+     */
+    public boolean expectContinue();
 
 }

Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java Tue Feb  7 23:38:21 2012
@@ -36,6 +36,9 @@ import org.apache.deft.io.buffer.Dynamic
 import org.apache.deft.util.ArrayUtil;
 import org.apache.deft.web.http.protocol.HttpVerb;
 
+/**
+ * TODO SLM Cleanup old Parsing code 
+ */
 public class HttpRequestImpl implements HttpRequest {
 
     private IOLoop ioLoop;
@@ -311,7 +314,7 @@ public class HttpRequestImpl implements 
 
     /**
      * Returns a collection of all values associated with the provided
-     * parameter. If no values are found and empty collection is returned.
+     * parameter. If no values are found an empty collection is returned.
      */
     @Override
     public Collection<String> getParameterValues(String name) {
@@ -342,6 +345,11 @@ public class HttpRequestImpl implements 
                 result += key + ":" + value + "\n";
             }
         }
+        if (getBody() != null) {
+        	result += "--- BODY --- \n";
+            result += getBody();
+        }
+        
         return result;
     }
 
@@ -459,5 +467,9 @@ public class HttpRequestImpl implements 
         }
         return res;
     }
+    
+    public boolean expectContinue() {    	
+    	return (bodyBuffer != null && bodyBuffer.position() == 0) && headers.get("expect") != null;
+    }
 
 }

Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpResponseImpl.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpResponseImpl.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpResponseImpl.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpResponseImpl.java Tue Feb  7 23:38:21 2012
@@ -19,11 +19,10 @@
  */
 package org.apache.deft.web.http;
 
-import static org.apache.deft.web.http.HttpServerDescriptor.WRITE_BUFFER_SIZE;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.FileChannel;
@@ -33,6 +32,10 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Charsets;
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
 import org.apache.deft.io.buffer.DynamicByteBuffer;
 import org.apache.deft.util.Closeables;
 import org.apache.deft.util.CookieUtil;
@@ -41,11 +44,7 @@ import org.apache.deft.util.HttpUtil;
 import org.apache.deft.web.http.protocol.HttpStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Charsets;
-import com.google.common.base.Strings;
-import com.google.common.collect.Maps;
+import static org.apache.deft.web.http.HttpServerDescriptor.WRITE_BUFFER_SIZE;
 
 public class HttpResponseImpl implements HttpResponse {
 
@@ -213,6 +212,7 @@ public class HttpResponseImpl implements
     public long finish() {
         long bytesWritten = 0;
         SocketChannel clientChannel = (SocketChannel) key.channel();
+        ByteBuffer buffer = null;
 
         if (key.attachment() instanceof MappedByteBuffer) {
             MappedByteBuffer mbb = (MappedByteBuffer) key.attachment();
@@ -224,9 +224,7 @@ public class HttpResponseImpl implements
                     Closeables.closeQuietly(key.channel());
                 }
             }
-            if (!mbb.hasRemaining()) {
-                protocol.closeOrRegisterForRead(key);
-            }
+            buffer = mbb;
         } else {
             if (clientChannel.isOpen()) {
                 if (!headersCreated) {
@@ -239,14 +237,14 @@ public class HttpResponseImpl implements
             // false)
             // (b) no DBB is attached (never had to register for write)
             if (key.attachment() instanceof DynamicByteBuffer) {
-                DynamicByteBuffer dbb = (DynamicByteBuffer) key.attachment();
-                if (!dbb.hasRemaining()) {
-                    protocol.closeOrRegisterForRead(key);
-                }
-            } else {
-                protocol.closeOrRegisterForRead(key);
+                buffer = ((DynamicByteBuffer) key.attachment()).getByteBuffer();
             }
         }
+        // Do Not Close the socket if there is more data to send or this is a CONTINUE
+        if ((buffer != null && buffer.hasRemaining()) || HttpStatus.SUCCESS_CONTINUE.equals(status)) {
+            return bytesWritten;
+        }
+        protocol.closeOrRegisterForRead(key);
         return bytesWritten;
     }
 

Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/http/protocol/HttpStatus.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/http/protocol/HttpStatus.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/http/protocol/HttpStatus.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/http/protocol/HttpStatus.java Tue Feb  7 23:38:21 2012
@@ -24,10 +24,14 @@ package org.apache.deft.web.http.protoco
  */
 public enum HttpStatus {
 
+	/**
+	 * 100 - CONTINUE
+	 */
+	SUCCESS_CONTINUE(100, "HTTP/1.1 100 Continue"),
     /**
      * 200 - OK
      */
-    SUCCESS_OK(200, "HTTP/1.1 200 OK"),
+    SUCCESS_OK(200, "HTTP/1.1 200 OK"),    
     /**
      * 201 - Created
      */

Modified: incubator/deft/trunk/src/test/java/org/apache/deft/web/DeftSystemTest.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/test/java/org/apache/deft/web/DeftSystemTest.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/test/java/org/apache/deft/web/DeftSystemTest.java (original)
+++ incubator/deft/trunk/src/test/java/org/apache/deft/web/DeftSystemTest.java Tue Feb  7 23:38:21 2012
@@ -310,6 +310,28 @@ public class DeftSystemTest {
     }
 
     @Test
+    public void postWithContinueTest() throws ClientProtocolException, IOException {
+
+        List<Header> headers = new LinkedList<Header>();
+        headers.add(new BasicHeader("Connection", "Close"));
+
+        HttpParams params = new BasicHttpParams();
+        params.setParameter("http.default-headers", headers);
+        params.setParameter("http.protocol.expect-continue", Boolean.TRUE);
+        HttpClient httpclient = new DefaultHttpClient(params);
+        HttpPost httppost = new HttpPost("http://localhost:" + PORT + "/post");
+        HttpResponse response = httpclient.execute(httppost);
+
+        assertNotNull(response);
+        assertEquals(HttpStatus.SUCCESS_OK.code(), response.getStatusLine().getStatusCode());
+        assertEquals(new ProtocolVersion("HTTP", 1, 1), response.getStatusLine().getProtocolVersion());
+        assertEquals("OK", response.getStatusLine().getReasonPhrase());
+
+        String payLoad = convertStreamToString(response.getEntity().getContent()).trim();
+        assertEquals("post", payLoad);
+    }
+
+    @Test
     public void putTest() throws ClientProtocolException, IOException {
 
         List<Header> headers = new LinkedList<Header>();

Modified: incubator/deft/trunk/src/test/java/org/apache/deft/web/http/protocol/HttpStatusTest.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/test/java/org/apache/deft/web/http/protocol/HttpStatusTest.java?rev=1241701&r1=1241700&r2=1241701&view=diff
==============================================================================
--- incubator/deft/trunk/src/test/java/org/apache/deft/web/http/protocol/HttpStatusTest.java (original)
+++ incubator/deft/trunk/src/test/java/org/apache/deft/web/http/protocol/HttpStatusTest.java Tue Feb  7 23:38:21 2012
@@ -19,18 +19,15 @@
  */
 package org.apache.deft.web.http.protocol;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 import org.junit.Test;
+import static org.junit.Assert.*;
 
 /**
  * Test cases for {@link HttpStatus}.
  */
 public class HttpStatusTest {
 
-    private static int STATUS_CODE_COUNT = 37;
+    private static int STATUS_CODE_COUNT = 38;
 
     @Test
     public void testCount() {
@@ -42,7 +39,7 @@ public class HttpStatusTest {
 
         for (final HttpStatus status : HttpStatus.values()) {
             if (status.name().startsWith("SUCCESS")) {
-                assertTrue("Incorrect: " + status.name(), status.code() >= 200 && status.code() < 300);
+                assertTrue("Incorrect: " + status.name(), status.code() >= 100 && status.code() < 300);
             } else if (status.name().startsWith("REDIRECTION")) {
                 assertTrue("Incorrect: " + status.name(), status.code() >= 300 && status.code() < 400);
             } else if (status.name().startsWith("CLIENT_ERROR")) {