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 "Davanum Srinivas (JIRA)" <ax...@ws.apache.org> on 2005/04/21 00:24:22 UTC
[jira] Resolved: (AXIS-1059) Cookies management broken in HTTP transport
[ http://issues.apache.org/jira/browse/AXIS-1059?page=all ]
Davanum Srinivas resolved AXIS-1059:
------------------------------------
Resolution: Fixed
Fixed. Please try latest CVS.
-- dims
> Cookies management broken in HTTP transport
> -------------------------------------------
>
> Key: AXIS-1059
> URL: http://issues.apache.org/jira/browse/AXIS-1059
> Project: Axis
> Type: Bug
> Components: Basic Architecture
> Versions: 1.1
> Environment: Operating System: Other
> Platform: All
> Reporter: Charles-Edouard Ruault
> Attachments: cookies.patch
>
> HTTPSender is designed to handle only one "set-cookie" header and therefore,
> when a server sends more than one cookie ( which is common ), only the last one
> is remembered.
> I'm attaching a small patch that fixes this issue ( but more work would be
> nedded to properly handle cookies , see TODO tags ).
> --- axis-1_1/src/org/apache/axis/transport/http/HTTPSender.java 2003-09-11
> 17:36:50.000000000 +0200
> +++ test/org/apache/axis/transport/http/HTTPSender.java 2003-09-11
> 18:25:47.000000000 +0200
> @@ -78,6 +78,7 @@
> import java.net.Socket;^M
> import java.net.URL;^M
> import java.util.Hashtable;^M
> +import java.util.Vector;^M
> ^M
> /**^M
> * This is meant to be used on a SOAP Client to call a SOAP server.^M
> @@ -88,7 +89,8 @@
> public class HTTPSender extends BasicHandler {^M
> ^M
> protected static Log log = LogFactory.getLog(HTTPSender.class.getName());^M
> -^M
> + protected static final String
> HTTP_SET_COOKIE_HEADER_LC=HTTPConstants.HEADER_SET_COOKIE.toLowerCase();^M
> + ^M
> /**^M
> * invoke creates a socket connection, sends the request SOAP message and
> then^M
> * reads the response SOAP message back from the SOAP server^M
> @@ -220,12 +222,23 @@
> // don't forget the cookies!^M
> // mmm... cookies^M
> if (msgContext.getMaintainSession()) {^M
> - String cookie = msgContext.getStrProp(HTTPConstants.HEADER_COOKIE);^M
> + Vector cookies =
> (Vector)msgContext.getProperty(HTTPConstants.HEADER_COOKIE);^M
> String cookie2 = msgContext.getStrProp(HTTPConstants.HEADER_COOKIE2);^M
> -^M
> - if (cookie != null) {^M
> - otherHeaders.append(HTTPConstants.HEADER_COOKIE).append(": ")^M
> + String cookie;^M
> + ^M
> + if (cookies != null) ^M
> + {^M
> + //Process all cookies. Add one Cookie Header per cookie.^M
> + for (int i=0; i<cookies.size(); i++)^M
> + {^M
> + /**^M
> + * TODO : we should send only cookies that have not
> expired^M
> + * and that are matching the current URI.^M
> + */^M
> + cookie=(String)cookies.elementAt(i); ^M
> +
> otherHeaders.append(HTTPConstants.HEADER_COOKIE).append(": ")^M
> .append(cookie).append("\r\n");^M
> + }^M
> }^M
> if (cookie2 != null) {^M
> otherHeaders.append(HTTPConstants.HEADER_COOKIE2).append(": ")^M
> @@ -566,8 +579,23 @@
> msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_MESSAGE,^M
> name.substring(start + end + 1));^M
> } else {^M
> - headers.put(name.toLowerCase(), value);^M
> - System.out.println("Got Header : "+name+"="+value);^M
> + name=name.toLowerCase();^M
> + //Check for Set-Cookie special case^M
> + if (name.equals(HTTP_SET_COOKIE_HEADER_LC))^M
> + {^M
> + //An HTTP response can contain multiple
> Set-Cookie headers,^M
> + //Make sure we preserve all of them^M
> + Vector
> cookies=(Vector)headers.get(HTTP_SET_COOKIE_HEADER_LC);^M
> + if (cookies==null)^M
> + {^M
> + cookies=new Vector();^M
> + headers.put(HTTP_SET_COOKIE_HEADER_LC,
> cookies);^M
> + }^M
> + cookies.add(value);^M
> + log.debug("Retrieved Cookie :
> "+value);^M
> + }^M
> + else^M
> + headers.put(name, value); ^M
> }^M
> len = 0;^M
> }^M
> @@ -699,17 +727,24 @@
> Hashtable headers, MessageContext msgContext) {^M
> ^M
> if (headers.containsKey(setCookieName.toLowerCase())) {^M
> - String cookie = (String) headers.get(setCookieName.toLowerCase());^M
> - System.out.println("HandleCookie "+cookie);^M
> - cookie = cookie.trim();^M
> -^M
> - // chop after first ; a la Apache SOAP (see HTTPUtils.java there)^M
> - int index = cookie.indexOf(';');^M
> -^M
> - if (index != -1) {^M
> - cookie = cookie.substring(0, index);^M
> - }^M
> - msgContext.setProperty(cookieName, cookie);^M
> + Vector cookies = (Vector) headers.get(setCookieName.toLowerCase());^M
> + ^M
> + for (int i=0; i<cookies.size(); i++)^M
> + {^M
> + String cookie = ((String)cookies.elementAt(i)).trim();
> ^M
> + // chop after first ; a la Apache SOAP (see HTTPUtils.java there)^M
> + int index = cookie.indexOf(';');^M
> + if (index != -1) ^M
> + {^M
> + /** ^M
> + * TODO: improve processing. ^M
> + * We should also keep track of the path, expiration
> date and secure flags.^M
> + */^M
> + cookie = cookie.substring(0, index);^M
> + cookies.set(i, cookie);^M
> + } ^M
> + }^M
> + msgContext.setProperty(cookieName, cookies);^M
> }^M
> }^M
> }^M
> --- axis-1_1/src/org/apache/axis/transport/http/HTTPTransport.java
> 2003-06-13 16:46:48.000000000 +0200
> +++ test/org/apache/axis/transport/http/HTTPTransport.java 2003-09-11
> 18:07:24.000000000 +0200
> @@ -55,6 +55,8 @@
> ^M
> package org.apache.axis.transport.http;^M
> ^M
> +import java.util.Vector;^M
> +^M
> import org.apache.axis.AxisEngine;^M
> import org.apache.axis.AxisFault;^M
> import org.apache.axis.MessageContext;^M
> @@ -80,7 +82,7 @@
> */^M
> public static final String URL = MessageContext.TRANS_URL;^M
> ^M
> - private String cookie;^M
> + private Vector cookies;^M
> private String cookie2;^M
> private String action;^M
> ^M
> @@ -116,8 +118,8 @@
> }^M
> ^M
> // Set up any cookies we know about^M
> - if (cookie != null)^M
> - mc.setProperty(HTTPConstants.HEADER_COOKIE, cookie);^M
> + if (cookies!= null)^M
> + mc.setProperty(HTTPConstants.HEADER_COOKIE, cookies);^M
> if (cookie2 != null)^M
> mc.setProperty(HTTPConstants.HEADER_COOKIE2, cookie2);^M
> ^M
> @@ -130,7 +132,7 @@
> }^M
> ^M
> public void processReturnedMessageContext(MessageContext context) {^M
> - cookie = context.getStrProp(HTTPConstants.HEADER_COOKIE);^M
> + cookies = (Vector)context.getProperty(HTTPConstants.HEADER_COOKIE);^M
> cookie2 = context.getStrProp(HTTPConstants.HEADER_COOKIE2);^M
> }^M
> }^M
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira