You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by di...@apache.org on 2005/04/21 00:18:59 UTC
cvs commit: ws-axis/java/src/org/apache/axis/transport/http CommonsHTTPSender.java HTTPSender.java HTTPTransport.java
dims 2005/04/20 15:18:59
Modified: java/src/org/apache/axis/transport/http
CommonsHTTPSender.java HTTPSender.java
HTTPTransport.java
Log:
Fix for AXIS-895 - Axis doesn't maintain more than one cookie with http
Revision Changes Path
1.31 +57 -23 ws-axis/java/src/org/apache/axis/transport/http/CommonsHTTPSender.java
Index: CommonsHTTPSender.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/transport/http/CommonsHTTPSender.java,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- CommonsHTTPSender.java 12 Apr 2005 23:42:49 -0000 1.30
+++ CommonsHTTPSender.java 20 Apr 2005 22:18:58 -0000 1.31
@@ -61,6 +61,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
+import java.util.ArrayList;
/**
* This class uses Jakarta Commons's HttpClient to call a SOAP server.
@@ -169,20 +170,8 @@
String host = hostConfiguration.getHost();
String path = targetURL.getPath();
boolean secure = hostConfiguration.getProtocol().isSecure();
- String ck1 = (String)msgContext.getProperty(HTTPConstants.HEADER_COOKIE);
- if (ck1 != null) {
- int index = ck1.indexOf('=');
- state.addCookie(new Cookie(host, ck1.substring(0, index),
- ck1.substring(index+1), path,
- null, secure));
- }
- String ck2 = (String)msgContext.getProperty(HTTPConstants.HEADER_COOKIE2);
- if (ck2 != null) {
- int index = ck2.indexOf('=');
- state.addCookie(new Cookie(host, ck2.substring(0, index),
- ck2.substring(index+1), path,
- null, secure));
- }
+ fillHeaders(msgContext, state, HTTPConstants.HEADER_COOKIE, host, path, secure);
+ fillHeaders(msgContext, state, HTTPConstants.HEADER_COOKIE2, host, path, secure);
httpClient.setState(state);
}
@@ -257,15 +246,25 @@
// handle cookies (if any)
if (msgContext.getMaintainSession()) {
Header[] headers = method.getResponseHeaders();
+ ArrayList cookies = new ArrayList();
+ ArrayList cookies2 = new ArrayList();
for (int i = 0; i < headers.length; i++) {
- if (headers[i].getName().equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE))
- msgContext.setProperty(HTTPConstants.HEADER_COOKIE,
- cleanupCookie(headers[i].getValue()));
- else if (headers[i].getName().equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE2))
- msgContext.setProperty(HTTPConstants.HEADER_COOKIE2,
- cleanupCookie(headers[i].getValue()));
+ if (headers[i].getName().equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE)) {
+ cookies.add(cleanupCookie(headers[i].getValue()));
+ } else if (headers[i].getName().equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE2)) {
+ cookies2.add(cleanupCookie(headers[i].getValue()));
+ }
+ }
+ if(cookies.size()==1) {
+ msgContext.setProperty(HTTPConstants.HEADER_COOKIE, cookies.get(0));
+ } else if (cookies.size() > 1) {
+ msgContext.setProperty(HTTPConstants.HEADER_COOKIE, cookies.toArray(new String[cookies.size()]));
+ }
+ if(cookies2.size()==1) {
+ msgContext.setProperty(HTTPConstants.HEADER_COOKIE2, cookies2.get(0));
+ } else if (cookies2.size() > 1) {
+ msgContext.setProperty(HTTPConstants.HEADER_COOKIE2, cookies2.toArray(new String[cookies2.size()]));
}
-
}
// always release the connection back to the pool if
@@ -284,7 +283,43 @@
"CommonsHTTPSender::invoke"));
}
}
-
+
+ /**
+ * Add cookies from message context
+ *
+ * @param msgContext
+ * @param state
+ * @param header
+ * @param host
+ * @param path
+ * @param secure
+ */
+ private void fillHeaders(MessageContext msgContext, HttpState state, String header, String host, String path, boolean secure) {
+ Object ck1 = msgContext.getProperty(header);
+ if (ck1 != null) {
+ if (ck1 instanceof String[]) {
+ String [] cookies = (String[]) ck1;
+ for (int i = 0; i < cookies.length; i++) {
+ addCookie(state, cookies[i], host, path, secure);
+ }
+ } else {
+ addCookie(state, (String) ck1, host, path, secure);
+ }
+ }
+ }
+
+ /**
+ * add cookie to state
+ * @param state
+ * @param cookie
+ */
+ private void addCookie(HttpState state, String cookie,String host, String path, boolean secure) {
+ int index = cookie.indexOf('=');
+ state.addCookie(new Cookie(host, cookie.substring(0, index),
+ cookie.substring(index + 1), path,
+ null, secure));
+ }
+
/**
* cleanup the cookie value.
*
@@ -296,7 +331,6 @@
cookie = cookie.trim();
// chop after first ; a la Apache SOAP (see HTTPUtils.java there)
int index = cookie.indexOf(';');
-
if (index != -1) {
cookie = cookie.substring(0, index);
}
1.126 +76 -34 ws-axis/java/src/org/apache/axis/transport/http/HTTPSender.java
Index: HTTPSender.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/transport/http/HTTPSender.java,v
retrieving revision 1.125
retrieving revision 1.126
diff -u -r1.125 -r1.126
--- HTTPSender.java 2 Feb 2005 17:54:58 -0000 1.125
+++ HTTPSender.java 20 Apr 2005 22:18:58 -0000 1.126
@@ -46,6 +46,8 @@
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Collection;
/**
* This is meant to be used on a SOAP Client to call a SOAP server.
@@ -243,17 +245,8 @@
// don't forget the cookies!
// mmm... cookies
if (msgContext.getMaintainSession()) {
- String cookie = msgContext.getStrProp(HTTPConstants.HEADER_COOKIE);
- String cookie2 = msgContext.getStrProp(HTTPConstants.HEADER_COOKIE2);
-
- if (cookie != null) {
- otherHeaders.append(HTTPConstants.HEADER_COOKIE).append(": ")
- .append(cookie).append("\r\n");
- }
- if (cookie2 != null) {
- otherHeaders.append(HTTPConstants.HEADER_COOKIE2).append(": ")
- .append(cookie2).append("\r\n");
- }
+ fillHeaders(msgContext, HTTPConstants.HEADER_COOKIE, otherHeaders);
+ fillHeaders(msgContext, HTTPConstants.HEADER_COOKIE2, otherHeaders);
}
StringBuffer header2 = new StringBuffer();
@@ -515,6 +508,37 @@
return inp;
}
+ /**
+ * Get cookies from message context and add it to the headers
+ * @param msgContext
+ * @param header
+ * @param otherHeaders
+ */
+ private void fillHeaders(MessageContext msgContext, String header, StringBuffer otherHeaders) {
+ Object ck1 = msgContext.getProperty(header);
+ if (ck1 != null) {
+ if (ck1 instanceof String[]) {
+ String [] cookies = (String[]) ck1;
+ for (int i = 0; i < cookies.length; i++) {
+ addCookie(otherHeaders, header, cookies[i]);
+ }
+ } else {
+ addCookie(otherHeaders, header, (String) ck1);
+ }
+ }
+ }
+
+ /**
+ * add cookie to headers
+ * @param otherHeaders
+ * @param header
+ * @param cookie
+ */
+ private void addCookie(StringBuffer otherHeaders, String header, String cookie) {
+ otherHeaders.append(header).append(": ")
+ .append(cookie).append("\r\n");
+ }
+
private InputStream readHeadersFromSocket(SocketHolder sockHolder,
MessageContext msgContext,
InputStream inp,
@@ -605,7 +629,22 @@
msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_MESSAGE,
name.substring(start + end + 1));
} else {
- headers.put(name.toLowerCase(), value);
+ // if we are maintaining session state,
+ // handle cookies (if any)
+ if (msgContext.getMaintainSession()) {
+ final String nameLowerCase = name.toLowerCase();
+ if (nameLowerCase.equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE)) {
+ handleCookie(HTTPConstants.HEADER_COOKIE,
+ HTTPConstants.HEADER_SET_COOKIE, value, msgContext);
+ } else if (nameLowerCase.equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE2)) {
+ handleCookie(HTTPConstants.HEADER_COOKIE2,
+ HTTPConstants.HEADER_SET_COOKIE2, value, msgContext);
+ } else {
+ headers.put(name.toLowerCase(), value);
+ }
+ } else {
+ headers.put(name.toLowerCase(), value);
+ }
}
len = 0;
}
@@ -745,39 +784,42 @@
log.debug(outMsg.getSOAPEnvelope().toString());
}
- // if we are maintaining session state,
- // handle cookies (if any)
- if (msgContext.getMaintainSession()) {
- handleCookie(HTTPConstants.HEADER_COOKIE,
- HTTPConstants.HEADER_SET_COOKIE, headers, msgContext);
- handleCookie(HTTPConstants.HEADER_COOKIE2,
- HTTPConstants.HEADER_SET_COOKIE2, headers, msgContext);
- }
return inp;
}
/**
- * little helper function for cookies
+ * little helper function for cookies. fills up the message context with
+ * a string or an array of strings (if there are more than one Set-Cookie)
*
* @param cookieName
* @param setCookieName
- * @param headers
+ * @param cookie
* @param msgContext
*/
public void handleCookie(String cookieName, String setCookieName,
- Hashtable headers, MessageContext msgContext) {
-
- if (headers.containsKey(setCookieName.toLowerCase())) {
- String cookie = (String) headers.get(setCookieName.toLowerCase());
- cookie = cookie.trim();
-
- // chop after first ; a la Apache SOAP (see HTTPUtils.java there)
- int index = cookie.indexOf(';');
-
- if (index != -1) {
- cookie = cookie.substring(0, index);
+ String cookie, MessageContext msgContext) {
+ ArrayList cookies = new ArrayList();
+ Object oldCookies = msgContext.getProperty(cookieName);
+ if(oldCookies != null) {
+ if(oldCookies instanceof String[]) {
+ cookies.addAll(java.util.Arrays.asList((String[])oldCookies));
+ } else {
+ cookies.add((String)oldCookies);
}
- msgContext.setProperty(cookieName, cookie);
+ }
+ cookie = cookie.trim();
+ // chop after first ; a la Apache SOAP (see HTTPUtils.java there)
+ int index = cookie.indexOf(';');
+ if (index != -1) {
+ cookie = cookie.substring(0, index);
+ }
+ if(cookies.indexOf(cookie)==-1) {
+ cookies.add(cookie);
+ }
+ if(cookies.size()==1) {
+ msgContext.setProperty(cookieName, cookies.get(0));
+ } else if (cookies.size() > 1) {
+ msgContext.setProperty(cookieName, cookies.toArray(new String[cookies.size()]));
}
}
}
1.22 +4 -4 ws-axis/java/src/org/apache/axis/transport/http/HTTPTransport.java
Index: HTTPTransport.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/transport/http/HTTPTransport.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- HTTPTransport.java 25 Feb 2004 14:02:45 -0000 1.21
+++ HTTPTransport.java 20 Apr 2005 22:18:58 -0000 1.22
@@ -41,8 +41,8 @@
*/
public static final String URL = MessageContext.TRANS_URL;
- private String cookie;
- private String cookie2;
+ private Object cookie;
+ private Object cookie2;
private String action;
public HTTPTransport () {
@@ -91,7 +91,7 @@
}
public void processReturnedMessageContext(MessageContext context) {
- cookie = context.getStrProp(HTTPConstants.HEADER_COOKIE);
- cookie2 = context.getStrProp(HTTPConstants.HEADER_COOKIE2);
+ cookie = context.getProperty(HTTPConstants.HEADER_COOKIE);
+ cookie2 = context.getProperty(HTTPConstants.HEADER_COOKIE2);
}
}