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() {