Skip to content

Commit 8477bf7

Browse files
linesightclaude
andcommitted
CEF 146: fix CanSendCookie/CanSaveCookie and cookie API issues
- Wire GetResourceRequestHandler in RequestHandler to return a ResourceRequestHandler (new file) that exposes GetCookieAccessFilter, restoring CanSendCookie/CanSaveCookie callbacks broken since CEF 146 moved them out of CefRequestHandler into CefCookieAccessFilter - Add #pragma once to cookie_access_filter.h to prevent C2011 redefinition when included from both request_handler.h and resource_request_handler.h - Fix Cookie.SetDomain() to accept leading-dot domains (.example.com) by stripping the dot before IDNA validation while preserving the original value stored in the cookie (RFC 2109 subdomain-matching convention) - Update setcookie.py: replace dead html-kit.com URL with google.com, set cookie in OnLoadEnd and verify with VisitUrlCookies Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 0be4137 commit 8477bf7

6 files changed

Lines changed: 100 additions & 20 deletions

File tree

examples/snippets/setcookie.py

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,56 @@
66
import datetime
77

88

9+
class LoadHandler(object):
10+
def OnLoadEnd(self, browser, frame, http_code, **_):
11+
if not frame.IsMain():
12+
return
13+
manager = cef.CookieManager.GetGlobalManager()
14+
cookie = cef.Cookie()
15+
cookie.Set({
16+
"name": "my_cookie",
17+
"value": "my_value",
18+
# Make sure domain is a valid value otherwise it crashes
19+
# app (Issue #459)
20+
"domain": ".google.com",
21+
"path": "/",
22+
"secure": True,
23+
"httpOnly": False,
24+
"creation": datetime.datetime(2018, 8, 22),
25+
"lastAccess": datetime.datetime(2018, 8, 22),
26+
"hasExpires": True,
27+
"expires": datetime.datetime(2028, 12, 31, 23, 59, 59),
28+
})
29+
manager.SetCookie("https://www.google.com/", cookie)
30+
print("Cookie set: my_cookie=my_value")
31+
32+
# Delay so SetCookie (async on IO thread) completes before visiting
33+
cef.PostDelayedTask(cef.TID_UI, 200, visit_cookies)
34+
35+
36+
def visit_cookies():
37+
manager = cef.CookieManager.GetGlobalManager()
38+
manager.VisitUrlCookies(
39+
"https://www.google.com/",
40+
False,
41+
CookieVisitor())
42+
43+
44+
class CookieVisitor(object):
45+
def Visit(self, cookie, count, total, delete_cookie_out):
46+
print("Cookie[%d/%d]: %s=%s (domain=%s)" % (
47+
count + 1, total,
48+
cookie.Get("name"), cookie.Get("value"),
49+
cookie.Get("domain")))
50+
return True # continue visiting
51+
52+
953
def main():
1054
cef.Initialize()
11-
cef.CreateBrowserSync(
12-
url="http://www.html-kit.com/tools/cookietester/",
55+
browser = cef.CreateBrowserSync(
56+
url="https://www.google.com/",
1357
window_title="Set a cookie")
14-
manager = cef.CookieManager.GetGlobalManager()
15-
cookie = cef.Cookie()
16-
cookie.Set({
17-
"name": "my_cookie",
18-
"value": "my_value",
19-
# Make sure domain is a valid value otherwise it crashes
20-
# app (Issue #459)
21-
"domain": "www.html-kit.com",
22-
"path": "/",
23-
"secure": False,
24-
"httpOnly": False,
25-
"creation": datetime.datetime(2018, 8, 22),
26-
"lastAccess": datetime.datetime(2018, 8, 22),
27-
"hasExpires": True,
28-
"expires": datetime.datetime(2028, 12, 31, 23, 59, 59),
29-
})
30-
manager.SetCookie("http://www.html-kit.com/", cookie)
58+
browser.SetClientHandler(LoadHandler())
3159
cef.MessageLoop()
3260
cef.Shutdown()
3361

src/client_handler/cookie_access_filter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// All rights reserved. Licensed under BSD 3-clause license.
33
// Project website: https://github.com/cztomczak/cefpython
44

5+
#pragma once
56
#include "common/cefpython_public_api.h"
67
#include "include/cef_resource_request_handler.h"
78

src/client_handler/request_handler.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@
77
#include "include/base/cef_callback.h"
88

99

10+
CefRefPtr<CefResourceRequestHandler> RequestHandler::GetResourceRequestHandler(
11+
CefRefPtr<CefBrowser> browser,
12+
CefRefPtr<CefFrame> frame,
13+
CefRefPtr<CefRequest> request,
14+
bool is_navigation,
15+
bool is_download,
16+
const CefString& request_initiator,
17+
bool& disable_default_handling) {
18+
return new ResourceRequestHandler();
19+
}
20+
21+
1022
bool RequestHandler::OnBeforeBrowse(CefRefPtr<CefBrowser> browser,
1123
CefRefPtr<CefFrame> frame,
1224
CefRefPtr<CefRequest> request,

src/client_handler/request_handler.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "include/cef_request_handler.h"
77
#include "include/base/cef_callback.h"
88
#include "cookie_access_filter.h"
9+
#include "resource_request_handler.h"
910

1011
typedef cef_return_value_t ReturnValue;
1112

@@ -17,6 +18,15 @@ class RequestHandler : public CefRequestHandler,
1718
RequestHandler(){}
1819
virtual ~RequestHandler(){}
1920

21+
CefRefPtr<CefResourceRequestHandler> GetResourceRequestHandler(
22+
CefRefPtr<CefBrowser> browser,
23+
CefRefPtr<CefFrame> frame,
24+
CefRefPtr<CefRequest> request,
25+
bool is_navigation,
26+
bool is_download,
27+
const CefString& request_initiator,
28+
bool& disable_default_handling) override;
29+
2030
bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,
2131
CefRefPtr<CefFrame> frame,
2232
CefRefPtr<CefRequest> request,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright (c) 2012 CEF Python, see the Authors file.
2+
// All rights reserved. Licensed under BSD 3-clause license.
3+
// Project website: https://github.com/cztomczak/cefpython
4+
5+
#pragma once
6+
#include "include/cef_resource_request_handler.h"
7+
#include "cookie_access_filter.h"
8+
9+
// Minimal CefResourceRequestHandler that returns a CookieAccessFilter.
10+
// CEF 146 moved CanSendCookie/CanSaveCookie out of CefRequestHandler into
11+
// CefCookieAccessFilter, reachable only via this intermediate interface.
12+
class ResourceRequestHandler : public CefResourceRequestHandler {
13+
public:
14+
ResourceRequestHandler() {}
15+
virtual ~ResourceRequestHandler() {}
16+
17+
CefRefPtr<CefCookieAccessFilter> GetCookieAccessFilter(
18+
CefRefPtr<CefBrowser> browser,
19+
CefRefPtr<CefFrame> frame,
20+
CefRefPtr<CefRequest> request) override {
21+
return new CookieAccessFilter();
22+
}
23+
24+
private:
25+
IMPLEMENT_REFCOUNTING(ResourceRequestHandler);
26+
};

src/cookie.pyx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,11 @@ cdef class Cookie:
125125
assert isinstance(domain, bytes), "domain type is not bytes"
126126
domain = domain.decode(g_applicationSettings["string_encoding"],
127127
errors=BYTES_DECODE_ERRORS)
128+
# Strip leading dot before validation; RFC 2109 allows .example.com to
129+
# mean "all subdomains", but IDNA encoding rejects empty labels.
130+
validate_domain = domain.lstrip(".")
128131
try:
129-
if not pattern.match(domain.encode("idna").decode("ascii")):
132+
if not pattern.match(validate_domain.encode("idna").decode("ascii")):
130133
raise Exception("Cookie.SetDomain() failed, invalid domain: {0}"
131134
.format(domain))
132135
except UnicodeError:

0 commit comments

Comments
 (0)