You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/11/19 12:06:44 UTC

svn commit: r596269 - in /mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http: DefaultHttpRequest.java HttpHeaderConstants.java HttpRequestDecodingState.java

Author: trustin
Date: Mon Nov 19 03:06:41 2007
New Revision: 596269

URL: http://svn.apache.org/viewvc?rev=596269&view=rev
Log:
* Fixed a problem that parameters are not set when url-encoded form is posted
* More HttpHeaderConstants utilization

Modified:
    mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/DefaultHttpRequest.java
    mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpHeaderConstants.java
    mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpRequestDecodingState.java

Modified: mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/DefaultHttpRequest.java
URL: http://svn.apache.org/viewvc/mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/DefaultHttpRequest.java?rev=596269&r1=596268&r2=596269&view=diff
==============================================================================
--- mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/DefaultHttpRequest.java (original)
+++ mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/DefaultHttpRequest.java Mon Nov 19 03:06:41 2007
@@ -23,6 +23,7 @@
 import java.net.URI;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.nio.charset.CharacterCodingException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -210,9 +211,11 @@
 
     public void setParameters(String queryString) {
         try {
-            this.setParameters(queryString, "UTF-8");
+            this.setParameters(queryString, HttpCodecUtils.DEFAULT_CHARSET_NAME);
         } catch (UnsupportedEncodingException e) {
-            throw new InternalError("UTF-8 decoder must be provided by JDK.");
+            throw new InternalError(
+                    HttpCodecUtils.DEFAULT_CHARSET_NAME +
+                    " decoder must be provided by JDK.");
         }
     }
 
@@ -268,6 +271,28 @@
 
     public Map<String, List<String>> getParameters() {
         return Collections.unmodifiableMap(parameters);
+    }
+
+    @Override
+    public void setContent(IoBuffer content) {
+        if (content == null) {
+            throw new NullPointerException("content");
+        }
+        
+        if (HttpHeaderConstants.VALUE_URLENCODED_FORM.equalsIgnoreCase(
+                getContentType())) {
+            content.mark();
+            try {
+                setParameters(content.getString(
+                        HttpCodecUtils.DEFAULT_CHARSET.newDecoder()));
+            } catch (CharacterCodingException e) {
+                throw new IllegalArgumentException(
+                        "Failed to decode the url-encoded content.", e);
+            } finally {
+                content.reset();
+            }
+        }
+        super.setContent(content);
     }
 
     /**

Modified: mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpHeaderConstants.java
URL: http://svn.apache.org/viewvc/mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpHeaderConstants.java?rev=596269&r1=596268&r2=596269&view=diff
==============================================================================
--- mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpHeaderConstants.java (original)
+++ mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpHeaderConstants.java Mon Nov 19 03:06:41 2007
@@ -70,6 +70,16 @@
     public static final String KEY_TRANSFER_CODING = "Transfer-Coding";
 
     /**
+     * The "transfer-encoding" header name
+     */
+    public static final String KEY_TRANSFER_ENCODING = "Transfer-Encoding";
+    
+    /**
+     * The chunked coding.
+     */
+    public static final String VALUE_CHUNKED = "chunked";
+
+    /**
      * The "expect" header name
      */
     public static final String KEY_EXPECT = "Expect";
@@ -85,6 +95,11 @@
     public static final String KEY_DATE = "Date";
     
     /**
+     * The "cookie" header.
+     */
+    public static final String KEY_COOKIE = "Cookie";
+
+    /**
      * The "set-cookie" header.
      */
     public static final String KEY_SET_COOKIE = "Set-Cookie";
@@ -93,6 +108,13 @@
      * The "host" header.
      */
     public static final String KEY_HOST = "Host";
+
+    /**
+     * An extension character that splits header values (e.g.
+     * transfer-encoding and cookie).
+     */
+    public static final char EXTENSION_CHAR = ';';
+
 
     private HttpHeaderConstants() {
     }

Modified: mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpRequestDecodingState.java
URL: http://svn.apache.org/viewvc/mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpRequestDecodingState.java?rev=596269&r1=596268&r2=596269&view=diff
==============================================================================
--- mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpRequestDecodingState.java (original)
+++ mina/trunk/filter-codec-http/src/main/java/org/apache/mina/filter/codec/http/HttpRequestDecodingState.java Mon Nov 19 03:06:41 2007
@@ -54,43 +54,11 @@
     private static final Logger LOG = LoggerFactory
             .getLogger(HttpRequestDecodingState.class);
 
-    private static final String HEADER_COOKIE = "Cookie";
-
-    /**
-     * The header which provides a requests transfer coding
-     */
-    private static final String TRANSFER_CODING = "transfer-encoding";
-
-    /**
-     * The chunked coding
-     */
-    private static final String CHUNKED = "chunked";
-
-    /**
-     * The header which provides a requests content length
-     */
-    private static final String CONTENT_LENGTH = "content-length";
-
-    /**
-     * Indicates the start of a coding extension
-     */
-    private static final char EXTENSION_CHAR = ';';
-
     /**
      * The request we are building
      */
     private MutableHttpRequest request;
 
-    private boolean parseCookies = true;
-
-    public boolean isParseCookies() {
-        return parseCookies;
-    }
-
-    public void setParseCookies(boolean parseCookies) {
-        this.parseCookies = parseCookies;
-    }
-
     @Override
     protected DecodingState init() throws Exception {
         request = new DefaultHttpRequest();
@@ -132,20 +100,23 @@
         @SuppressWarnings("unchecked")
         protected DecodingState finishDecode(List<Object> childProducts,
                 ProtocolDecoderOutput out) throws Exception {
-            Map<String, List<String>> headers = (Map<String, List<String>>) childProducts
-                    .get(0);
-            if (parseCookies) {
-                List<String> cookies = headers.remove(HEADER_COOKIE);
-                if (cookies != null && !cookies.isEmpty()) {
-                    if (cookies.size() > 1) {
-                        if (LOG.isWarnEnabled()) {
-                            LOG.warn("Ignoring extra cookie headers: "
-                                    + cookies.subList(1, cookies.size()));
-                        }
+            Map<String, List<String>> headers =
+                (Map<String, List<String>>) childProducts.get(0);
+            
+            // Set cookies.
+            List<String> cookies = headers.get(
+                    HttpHeaderConstants.KEY_COOKIE);
+            if (cookies != null && !cookies.isEmpty()) {
+                if (cookies.size() > 1) {
+                    if (LOG.isWarnEnabled()) {
+                        LOG.warn("Ignoring extra cookie headers: "
+                                + cookies.subList(1, cookies.size()));
                     }
-                    request.setCookies(cookies.get(0));
                 }
+                request.setCookies(cookies.get(0));
             }
+
+            // Set headers.
             request.setHeaders(headers);
 
             if (LOG.isDebugEnabled()) {
@@ -226,7 +197,8 @@
         private int getContentLength(HttpRequest request)
                 throws ProtocolDecoderException {
             int length = 0;
-            String lengthValue = request.getHeader(CONTENT_LENGTH);
+            String lengthValue = request.getHeader(
+                    HttpHeaderConstants.KEY_CONTENT_LENGTH);
             if (lengthValue != null) {
                 try {
                     length = Integer.parseInt(lengthValue);
@@ -252,13 +224,20 @@
         private boolean isChunked(HttpRequest request)
                 throws ProtocolDecoderException {
             boolean isChunked = false;
-            String coding = request.getHeader(TRANSFER_CODING);
+            String coding = request.getHeader(
+                    HttpHeaderConstants.KEY_TRANSFER_ENCODING);
+            if (coding == null) {
+                coding = request.getHeader(
+                        HttpHeaderConstants.KEY_TRANSFER_CODING);
+            }
+
             if (coding != null) {
-                int extensionIndex = coding.indexOf(EXTENSION_CHAR);
+                int extensionIndex = coding.indexOf(
+                        HttpHeaderConstants.EXTENSION_CHAR);
                 if (extensionIndex != -1) {
                     coding = coding.substring(0, extensionIndex);
                 }
-                if (CHUNKED.equalsIgnoreCase(coding)) {
+                if (HttpHeaderConstants.VALUE_CHUNKED.equalsIgnoreCase(coding)) {
                     isChunked = true;
                 } else {
                     // As we only support chunked encoding, any other encoding