Author: trustin
Date: Thu Jan 24 02:30:05 2008
New Revision: 614834

URL: http://svn.apache.org/viewvc?rev=614834&view=rev
Log:
Resolved issue: DIRMINA-517 (MINA HTTP codec handles HTTP 100 Continue 
improperly)
* Applied Tuure Laurinolli's patch that makes the HTTP codec understand 
100-continue response.

Modified:
    
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseDecodingState.java
    
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseStatus.java

Modified: 
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseDecodingState.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseDecodingState.java?rev=614834&r1=614833&r2=614834&view=diff
==============================================================================
--- 
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseDecodingState.java
 (original)
+++ 
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseDecodingState.java
 Thu Jan 24 02:30:05 2008
@@ -123,14 +123,29 @@
                 return null;
             }
             response.setProtocolVersion((HttpVersion) childProducts.get(0));
-            response.setStatus(HttpResponseStatus.forId((Integer) 
childProducts.get(1)));
-            String reasonPhrase = (String) childProducts.get(2);
-            if (reasonPhrase.length() > 0) {
-                response.setStatusReasonPhrase(reasonPhrase);
+            final HttpResponseStatus status = 
HttpResponseStatus.forId((Integer) childProducts.get(1));
+            if (status.isFinalResponse()) {
+                response.setStatus(status);
+                String reasonPhrase = (String) childProducts.get(2);
+                if (reasonPhrase.length() > 0) {
+                    response.setStatusReasonPhrase(reasonPhrase);
+                }
+                return READ_HEADERS;
+            } else {
+                return SKIP_HEADERS;
             }
-            return READ_HEADERS;
         }
     };
+    
+    private final DecodingState SKIP_HEADERS = new HttpHeaderDecodingState() {
+        @Override
+        @SuppressWarnings("unchecked")
+        protected DecodingState finishDecode(
+                List<Object> childProducts, ProtocolDecoderOutput out) throws 
Exception {
+            return READ_RESPONSE_LINE;
+        }
+    };
+
 
     private final DecodingState READ_HEADERS = new HttpHeaderDecodingState() {
         @Override

Modified: 
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseStatus.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseStatus.java?rev=614834&r1=614833&r2=614834&view=diff
==============================================================================
--- 
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseStatus.java
 (original)
+++ 
mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpResponseStatus.java
 Thu Jan 24 02:30:05 2008
@@ -39,10 +39,10 @@
     // Informational status codes
 
     public static final HttpResponseStatus CONTINUE = new HttpResponseStatus(
-            100, "Continue", true, false);
+            100, "Continue", false, false, false);
 
     public static final HttpResponseStatus SWITCHING_PROTOCOLS = new 
HttpResponseStatus(
-            101, "Switching Protocols", true, false);
+            101, "Switching Protocols", false, false);
 
     // Successful status codes
 
@@ -167,14 +167,12 @@
             505, "HTTP Version not supported", true, false);
 
     private final int code;
-
     private final transient boolean allowsMessageBody;
-
     private final transient boolean forcesConnectionClosure;
-
     private final transient Category category;
-
     private final transient String description;
+    private final transient boolean finalResponse;
+
 
     /**
      * @return  <code>true</code> iff a message body may be transmitted in
@@ -191,6 +189,13 @@
     public boolean forcesConnectionClosure() {
         return forcesConnectionClosure;
     }
+    
+    /**
+     * @return  Is this a final response? 100 Continue isn't.
+     */
+    public boolean isFinalResponse() {
+        return finalResponse;
+    }
 
     /**
      * @return The response code of this status
@@ -283,12 +288,18 @@
 
     private HttpResponseStatus(int code, String description,
             boolean allowsMessageBody, boolean forcesConnectionClosure) {
+        this(code, description, allowsMessageBody, forcesConnectionClosure, 
true);
+    }
+    private HttpResponseStatus(int code, String description,
+            boolean allowsMessageBody, boolean forcesConnectionClosure,
+            boolean finalResponse) {
         RESPONSE_TABLE[code] = this;
         this.code = code;
         this.category = categoryForId(code);
         this.description = description;
         this.allowsMessageBody = allowsMessageBody;
         this.forcesConnectionClosure = forcesConnectionClosure;
+        this.finalResponse = finalResponse;
     }
 
     private Object readResolve() {


Reply via email to