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);
       }
   }