Here's my patch.  Attached is a diff for SOAPHTTPConnection and a new file for
org.apache.soap.transport.http.Cookie.

I have tested this locally with samples.addressbook2.Main to confirm that it
does not break the existing functionality.  I have also tested the new Cookie
class with a test harness to verify many of its behaviors vis-a-vis the cookie
RFCs.  However, I will leave it up to Swami and the community to actually break
it ;).

Scott Nichol

----- Original Message -----
From: "Scott Nichol" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, June 06, 2002 2:45 PM
Subject: Re: Session Scope and Cookies


> I'll give this a try.
>
> Scott Nichol
> ----- Original Message -----
> From: "K. Swaminathan" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Thursday, June 06, 2002 2:11 PM
> Subject: RE: Session Scope and Cookies
>
>
> > ->If its an issue with SOAP 2.2 its not solved with 2.3. I wrote the
> > ->cookie stuff with the expectation that there would be only one (I
> > ->don't recall my mental state then but probably it was a combination
> > ->of lack of understanding and laziness ;-)).
> >
> > ->Can you submit a patch to fix it?
> > The cleaner fix to this requires some dissection on, HttpUtils,
> > TransportMessage, and SOAPHttpConnection, to make sure that
> > the hashtable that contains the header values, stores all the
> > Set-Cookie/Set-Cookie2 values, (perhaps in a String[] instead
> > of a String).
> > The Http-Spec seems to expects you to 'comma separate' these
> > multiple values and set them as a single(!!!) header in the request.
> >
> >
> > Can someone who is more familiar with the code/specs, volunteer.
> >
> > thanks
> > Swami K.
> >
> > ->
> > ->Bye,
> > ->
> > ->Sanjiva.
> > ->
> > ->----- Original Message -----
> > ->From: "K. Swaminathan" <[EMAIL PROTECTED]>
> > ->To: <[EMAIL PROTECTED]>
> > ->Sent: Wednesday, June 05, 2002 5:44 AM
> > ->Subject: Session Scope and Cookies
> > ->
> > ->
> > ->>
> > ->>  The SOAPHttpConnection.java, seems to remember and restore
> > ->only a single
> > ->> entry
> > ->>  for the Set-Cookie and Set-Cookie2 header fields, whereas the
> > ->spec allows
> > ->> for
> > ->>  more than one to be present.
> > ->>
> > ->>  Is this a solved issue in SOAP 2.3??
> > ->>
> > ->> thanks
> > ->> Swami K.
> > ->>
> > ->>
> > ->> >One thing to point out, this is a CLIENT side issue not a server side
> > ->> issue.
> > ->> >
> > ->> >It does appear to be correct that multiple entries can be sent in the
> > ->same
> > ->> >"Cookie:" value, but in terms of storing an manipulating them
> > ->this has to
> > ->> be
> > ->> >done outside of the XML-SOAP code.  (Thanks for that one Scott).
> > ->> >
> > ->> >On the non-passing of the transport headers, this is still there in the
> > ->> >current nightly build.  This does appear to be a minor
> > ->bug-ette.  Is the
> > ->> fix
> > ->> >that sends the headers from the transport acceptable ?
> > ->> >
> > ->> >Steve
> > ->> >
> > ->> > -----Original Message-----
> > ->> > From: Steve Jones [SMTP:[EMAIL PROTECTED]]
> > ->> > Sent: 04 April 2001 16:45
> > ->> > To: Soap-Dev (E-mail)
> > ->> > Subject: Session scope and cookies...
> > ->> >
> > ->> >...
> > ->> > The problem is that because the headers is a hashtable indexed by the
> > ->key
> > ->> > then only one cookie can be sent.  This is fine for my example as the
> > ->only
> > ->> > cookie is the JSESSIONID, if however another cookie was sent
> > ->it would be
> > ->> > up
> > ->> > for grabs which one is sent back.
> > ->> >
> > ->> > What should I really have done ?
> > ->> >
> > ->> > Steve
> > ->
> > ->
> >
> >
>
>

Attachment: Cookie.java
Description: Binary data

--- SOAPHTTPConnection.java.orig        Fri Jun 07 01:51:58 2002
+++ SOAPHTTPConnection.java     Fri Jun 07 02:06:15 2002
@@ -95,8 +95,8 @@
   private String proxyUserName;
   private String proxyPassword;
   private boolean maintainSession = true;
-  private String cookieHeader;
-  private String cookieHeader2;
+  private Cookie[] cookies;
+  private Cookie[] cookies2;
   private int    outputBufferSize = HTTPUtils.DEFAULT_OUTPUT_BUFFER_SIZE;
   private Boolean tcpNoDelay = null;
 
@@ -183,8 +183,8 @@
   public void setMaintainSession (boolean maintainSession) {
     this.maintainSession = maintainSession;
     if (maintainSession == false) {
-      cookieHeader = null;
-      cookieHeader2 = null;
+      cookies = null;
+      cookies2 = null;
     }
   }
 
@@ -279,11 +279,11 @@
       }
       if (maintainSession) {
         // if there is saved cookie headers, put them in to the request
-        if (cookieHeader2 != null) { // RFC 2965 header
-          headers.put ("Cookie2", cookieHeader2);
+        if (cookies2 != null) { // RFC 2965 header
+          headers.put ("Cookie2", Cookie.buildCookieValue(sendTo, cookies2));
         } 
-        if (cookieHeader != null) { // RFC 2109 header
-          headers.put ("Cookie", cookieHeader);
+        if (cookies != null) { // RFC 2109 header
+          headers.put ("Cookie", Cookie.buildCookieValue(sendTo, cookies));
         }
       }
 
@@ -323,8 +323,7 @@
       responseSOAPContext = response.getSOAPContext();
       responseHeaders = response.getHeaders();
       if (maintainSession) {
-        // look for Set-Cookie2 and Set-Cookie headers and save them after
-        // stripping everything after the ';' (i.e., ignore all cookie attrs).
+        // look for Set-Cookie2 and Set-Cookie headers and save them.
         // Only update my state iff the header is there .. otherwise
         // leave the current 
         // Note: Header is case-insensitive
@@ -333,21 +332,21 @@
         hdr = getHeaderValue (responseHeaders, "Set-Cookie2");
 
         if (hdr != null) {
-          cookieHeader2 = hdr;
-          int index = cookieHeader2.indexOf (';');
-          if (index != -1) {
-            cookieHeader2 = cookieHeader2.substring (0, index);
-          }
+          Cookie[] hdrCookies = Cookie.parseCookies(sendTo, hdr);
+          if (cookies2 != null)
+            cookies2 = Cookie.updateCookies(cookies2, hdrCookies);
+          else
+            cookies2 = hdrCookies;
         }
 
         hdr = getHeaderValue (responseHeaders, "Set-Cookie");
 
         if (hdr != null) {
-          cookieHeader = hdr;
-          int index = cookieHeader.indexOf (';');
-          if (index != -1) {
-            cookieHeader = cookieHeader.substring (0, index);
-          }
+          Cookie[] hdrCookies = Cookie.parseCookies(sendTo, hdr);
+          if (cookies != null)
+            cookies = Cookie.updateCookies(cookies, hdrCookies);
+          else
+            cookies = hdrCookies;
         }
       }
     } catch (IllegalArgumentException e) {

Reply via email to