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