Hi,

I want to re-raise the topic of duplicate cookies.  I've had this issue with
the older version of Drakma (1.1.0) and was unaware of the patch with
*remove-duplicate-cookies-p*.
But investigating the problem (before I've read the discussion in the
mailing list), I've encountered it's cause in the source code, that is
highlighted in the attached diff.  The problem is, that SET-DIFFERENCE and
UNION are not supplied COOKIE= tests in UPDATE-COOKIES.

It still remains in the current version (1.2.2) and can be tested like this:

CL-USER> (defvar *cookies* (make-instance 'drakma:cookie-jar))
*COOKIES*
CL-USER> (drakma::update-cookies (list (make-instance 'drakma:cookie :name
"lang" :value "en" :domain "site.com" :path "/")
                                      (make-instance 'drakma:cookie :name
"lang" :value "en" :domain "site.com" :path "/"))
                                *cookies*)
#<DRAKMA:COOKIE-JAR (with 2 cookies) {B629521}>

I think, that this is a bug, because without the TEST argument, for example,
SET-DIFFERENCE in this case will constantly return the first set (see
below), so either the code should be simplified or the test argument should
be added.

CL-USER> (set-difference (list (make-instance 'drakma:cookie :name "lang"
:value "en" :domain "site.com" :path "/")
                              (make-instance 'drakma:cookie :name "lang"
:value "en" :domain "site.com" :path "/"))
                        (list (make-instance 'drakma:cookie :name "lang"
:value "en" :domain "site.com" :path "/")
                              (make-instance 'drakma:cookie :name "lang"
:value "en" :domain "site.com" :path "/")))
(#<DRAKMA:COOKIE lang=en; path=/; domain=site.com>
 #<DRAKMA:COOKIE lang=en; path=/; domain=site.com>)

So, I believe, that this part should also be fixed, especially, since
UPDATE-COOKIES is called alongside with GET-COOKIES.

Best regards,
Vsevolod
--- cookies.lisp	2010-07-10 13:02:53.000000000 +0300
+++ cookies-new.lisp	2010-07-29 12:13:06.000000000 +0300
@@ -299,7 +299,8 @@
                      collect (or (find old-cookie new-cookies :test #'cookie=)
                                  old-cookie))))
           (union updated-cookies
-                 (set-difference new-cookies updated-cookies))))                               
+                 (set-difference new-cookies updated-cookies :test #'cookie=)
+                 :test #'cookie=)))
   cookie-jar)
 
 (defun delete-old-cookies (cookie-jar)
_______________________________________________
drakma-devel mailing list
drakma-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/drakma-devel

Reply via email to