WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
156295
[SOUP] Implement PlatformCookieJar::addCookie
https://bugs.webkit.org/show_bug.cgi?id=156295
Summary
[SOUP] Implement PlatformCookieJar::addCookie
Blaze Burg
Reported
2016-04-06 11:11:13 PDT
Stub for implementing new CookieJar API.
Attachments
[SOUP] Implement PlatformCookieJar::addCookie
(2.82 KB, patch)
2016-04-07 11:39 PDT
,
Michael Catanzaro
no flags
Details
Formatted Diff
Diff
Patch
(2.76 KB, patch)
2016-04-27 15:09 PDT
,
Michael Catanzaro
no flags
Details
Formatted Diff
Diff
Show Obsolete
(1)
View All
Add attachment
proposed patch, testcase, etc.
Michael Catanzaro
Comment 1
2016-04-06 16:54:17 PDT
Thanks for the heads-up on this!
Michael Catanzaro
Comment 2
2016-04-06 19:56:51 PDT
Hey Brian, since you haven't landed your patch in
bug #156091
yet, here's an implementation you can add to it: void addCookie(const NetworkStorageSession& session, const URL&, const Cookie& cookie) { // Ref is consumed by soup_cookie_jar_add_cookie. SoupCookie* soupCookie = soup_cookie_new(cookie.name.utf8().data(), cookie.value.utf8().data(), cookie.domain.utf8().data(), cookie.path.utf8().data(), static_cast<int>(cookie.expires)); soup_cookie_set_http_only(soupCookie, cookie.httpOnly); soup_cookie_set_secure(soupCookie, cookie.secure); if (cookie.session) soup_cookie_set_max_age(soupCookie, -1); SoupCookieJar* cookieJar = cookieJarForSession(session); soup_cookie_jar_add_cookie(cookieJar, soupCookie); } It compiles, and it might even work!
Blaze Burg
Comment 3
2016-04-06 20:07:06 PDT
(In reply to
comment #2
)
> Hey Brian, since you haven't landed your patch in
bug #156091
yet, here's an > implementation you can add to it: > > void addCookie(const NetworkStorageSession& session, const URL&, const > Cookie& cookie) > { > // Ref is consumed by soup_cookie_jar_add_cookie. > SoupCookie* soupCookie = soup_cookie_new(cookie.name.utf8().data(), > cookie.value.utf8().data(), > cookie.domain.utf8().data(), cookie.path.utf8().data(), > static_cast<int>(cookie.expires)); > soup_cookie_set_http_only(soupCookie, cookie.httpOnly); > soup_cookie_set_secure(soupCookie, cookie.secure); > if (cookie.session) > soup_cookie_set_max_age(soupCookie, -1); > > SoupCookieJar* cookieJar = cookieJarForSession(session); > soup_cookie_jar_add_cookie(cookieJar, soupCookie); > } > > It compiles, and it might even work!
Awesome! Let's land it separately though, so that it can be reviewed by someone familiar with Soup :)
Carlos Garcia Campos
Comment 4
2016-04-06 23:09:25 PDT
(In reply to
comment #2
)
> Hey Brian, since you haven't landed your patch in
bug #156091
yet, here's an > implementation you can add to it: > > void addCookie(const NetworkStorageSession& session, const URL&, const > Cookie& cookie) > { > // Ref is consumed by soup_cookie_jar_add_cookie.
This comment is very confusing. I normally use consume for floating references, meaning that the weak ref is converted to a normal ref, but SoupCookieJar is not even ref counted. So, I would not use Ref, and would say adopted instead of consumed.
> SoupCookie* soupCookie = soup_cookie_new(cookie.name.utf8().data(), > cookie.value.utf8().data(), > cookie.domain.utf8().data(), cookie.path.utf8().data(), > static_cast<int>(cookie.expires));
I'm not sure this is correct, max_age is the number of seconds since now, but expires is an exact date (stored as an interval in milliseconds, it seems). so, I think we should pass -1 here always, and then use soup_cookie_set_expires() converting the expires interval to a SoupDate.
> soup_cookie_set_http_only(soupCookie, cookie.httpOnly); > soup_cookie_set_secure(soupCookie, cookie.secure); > if (cookie.session) > soup_cookie_set_max_age(soupCookie, -1); > > SoupCookieJar* cookieJar = cookieJarForSession(session); > soup_cookie_jar_add_cookie(cookieJar, soupCookie);
This could be a single line, no need to keep the local variable. Actually, I think even the cookie transfer could be more obvious if we use a helper function to create a SoupCookie out of a Cookie and then simply do: soup_cookie_jar_add_cookie(cookieJarForSession(session), toSoupCookie(cookie));
> } > > It compiles, and it might even work!
I'm not sure it works . . . Please, check what expires actually means in both soup and WebCore.
Dan Winship
Comment 5
2016-04-07 05:35:56 PDT
(In reply to
comment #4
)
> I'm not sure this is correct, max_age is the number of seconds since now, > but expires is an exact date (stored as an interval in milliseconds, it > seems). so, I think we should pass -1 here always, and then use > soup_cookie_set_expires() converting the expires interval to a SoupDate.
...unless...
> > if (cookie.session) > > soup_cookie_set_max_age(soupCookie, -1);
...it's a session cookie. You only want to call one of set_expires() and set_max_age()
Michael Catanzaro
Comment 6
2016-04-07 05:39:45 PDT
Thanks Dan. (In reply to
comment #4
)
> This comment is very confusing. I normally use consume for floating > references, meaning that the weak ref is converted to a normal ref, but > SoupCookieJar is not even ref counted. So, I would not use Ref, and would > say adopted instead of consumed.
OK.
> expires is an exact date (stored as an interval in milliseconds, it > seems).
No way to tell from the struct. :(
> so, I think we should pass -1 here always, and then use > soup_cookie_set_expires() converting the expires interval to a SoupDate.
Good idea.
> This could be a single line, no need to keep the local variable.
OK.
> Actually, I > think even the cookie transfer could be more obvious if we use a helper > function to create a SoupCookie out of a Cookie and then simply do: > > soup_cookie_jar_add_cookie(cookieJarForSession(session), > toSoupCookie(cookie));
OK.
Blaze Burg
Comment 7
2016-04-07 10:23:35 PDT
(In reply to
comment #6
)
> Thanks Dan. > > (In reply to
comment #4
) > > This comment is very confusing. I normally use consume for floating > > references, meaning that the weak ref is converted to a normal ref, but > > SoupCookieJar is not even ref counted. So, I would not use Ref, and would > > say adopted instead of consumed. > > OK. > > > expires is an exact date (stored as an interval in milliseconds, it > > seems). > > No way to tell from the struct. :(
It is milliseconds since the UNIX epoch. I added a comment in another patch to be landed, since I had this question as well.
> > > so, I think we should pass -1 here always, and then use > > soup_cookie_set_expires() converting the expires interval to a SoupDate. > > Good idea. > > > This could be a single line, no need to keep the local variable. > > OK. > > > Actually, I > > think even the cookie transfer could be more obvious if we use a helper > > function to create a SoupCookie out of a Cookie and then simply do: > > > > soup_cookie_jar_add_cookie(cookieJarForSession(session), > > toSoupCookie(cookie)); > > OK.
Michael Catanzaro
Comment 8
2016-04-07 11:21:06 PDT
(In reply to
comment #7
)
> It is milliseconds since the UNIX epoch. I added a comment in another patch > to be landed, since I had this question as well.
Great. Another reminder not to assume.... Anyway, this was a bit tricky to handle properly; I was particularly disappointed to see it's impossible to portably convert from a double to a time_t, but fortunately WTF has better time functions than the standard library, so it wasn't needed in the end.
Michael Catanzaro
Comment 9
2016-04-07 11:39:10 PDT
Created
attachment 275904
[details]
[SOUP] Implement PlatformCookieJar::addCookie
Carlos Garcia Campos
Comment 10
2016-04-07 22:18:38 PDT
Comment on
attachment 275904
[details]
[SOUP] Implement PlatformCookieJar::addCookie View in context:
https://bugs.webkit.org/attachment.cgi?id=275904&action=review
> Source/WebCore/platform/network/soup/CookieJarSoup.cpp:205 > -void addCookie(const NetworkStorageSession&, const URL&, const Cookie&) > +static SoupDate* msToSoupDate(double ms) > { > - // FIXME: implement this command. <
https://webkit.org/b/156295
> > - notImplemented(); > + int year = msToYear(ms); > + int dayOfYear = dayInYear(ms, year); > + bool leapYear = isLeapYear(year); > + int day = dayInMonthFromDayInYear(dayOfYear, leapYear); > + int month = monthFromDayInYear(dayOfYear, leapYear); > + int hour = msToHours(ms); > + int minute = msToMinutes(ms); > + int second = static_cast<int>(ms / 1000) % 60; > + return soup_date_new(year, month, day, hour, minute, second); > +}
I don't understand this. If the WebCore cookie expires is the number of milliseconds elapsed since the epoch, can't we just convert from milliseconds to seconds and use soup_date_new_from_time_t?
Michael Catanzaro
Comment 11
2016-04-08 07:59:55 PDT
(In reply to
comment #10
)
> I don't understand this. If the WebCore cookie expires is the number of > milliseconds elapsed since the epoch, can't we just convert from > milliseconds to seconds and use soup_date_new_from_time_t?
Kinda, but I don't know what systems that might break on. Unfortunately there seems to be no portable way to convert from a double (or int) to a time_t. I wanted to assume that the time_t stores time in seconds since the epoch and do static_cast<std::time_t>(cookie.expires / 1000), but turns out C++ does not guarantee that; very frustrating. :(
Michael Catanzaro
Comment 12
2016-04-23 18:53:50 PDT
Carlos?
Carlos Garcia Campos
Comment 13
2016-04-24 23:57:42 PDT
Comment on
attachment 275904
[details]
[SOUP] Implement PlatformCookieJar::addCookie View in context:
https://bugs.webkit.org/attachment.cgi?id=275904&action=review
EWS is red, please submit a new patch for EWS before landing this
> Source/WebCore/platform/network/soup/CookieJarSoup.cpp:204 > + int year = msToYear(ms); > + int dayOfYear = dayInYear(ms, year); > + bool leapYear = isLeapYear(year); > + int day = dayInMonthFromDayInYear(dayOfYear, leapYear); > + int month = monthFromDayInYear(dayOfYear, leapYear); > + int hour = msToHours(ms); > + int minute = msToMinutes(ms); > + int second = static_cast<int>(ms / 1000) % 60; > + return soup_date_new(year, month, day, hour, minute, second);
I still don't understand this, but if you say there's no better way, it's fine with me. I wonder if it would look simpler without using all the local variables, something like: return soup_date_new(year, monthFromDayInYear(dayOfYear, leapYear), dayInMonthFromDayInYear(dayOfYear, leapYear), msToHours(ms), msToMinutes(ms), static_cast<int>(ms / 1000) % 60);
Michael Catanzaro
Comment 14
2016-04-27 14:15:21 PDT
(In reply to
comment #13
)
> I still don't understand this
C++ doesn't guarantee how time_t is used to store time. I think maybe POSIX guarantees it's seconds since the epoch, but I'm not sure, and I think this code should be portable.
Michael Catanzaro
Comment 15
2016-04-27 15:09:57 PDT
Created
attachment 277540
[details]
Patch
WebKit Commit Bot
Comment 16
2016-04-27 16:31:45 PDT
Comment on
attachment 277540
[details]
Patch Clearing flags on attachment: 277540 Committed
r200159
: <
http://trac.webkit.org/changeset/200159
>
WebKit Commit Bot
Comment 17
2016-04-27 16:31:51 PDT
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug