与juju/persistent-cookiejar库不同的地方:
- 移除了cookie保存到文件的功能.
- 增加了序列化和反序列化到
json/gob.
提供序列化和反序列能力, 如何存储这些数据交给调用方. 序列化的cookie会包含那些无过期时间的cookie.
func TestJar_MarshalJSON(t *testing.T) {
jar, err := New(nil)
require.NoError(t, err)
{
// --- Mock 域名 A (Google) ---
u1, _ := url.Parse("https://google.com")
cookies1 := []*http.Cookie{
{Name: "SID", Value: "google_session_id", Domain: ".google.com", Path: "/"},
}
jar.SetCookies(u1, cookies1)
// --- Mock 域名 B (GitHub) ---
u2, _ := url.Parse("https://github.com")
cookies2 := []*http.Cookie{
{Name: "logged_in", Value: "yes", Domain: ".github.com", Path: "/"},
{Name: "user_session", Value: "gh_tok_12345", Domain: ".github.com", Path: "/"},
}
jar.SetCookies(u2, cookies2)
// --- Mock 域名 C (Baidu) ---
u3, _ := url.Parse("https://baidu.com")
cookies3 := []*http.Cookie{
{Name: "BDUSS", Value: "baidu_token_xyz", Domain: ".baidu.com", Path: "/"},
}
jar.SetCookies(u3, cookies3)
}
ret, err := json.Marshal(jar)
require.NoError(t, err)
t.Log(string(ret))
}
func TestJar_UnmarshalJSON(t *testing.T) {
const jsonData = `[{"Name":"BDUSS","Value":"baidu_token_xyz","Domain":"baidu.com","Path":"/","Secure":false,"HttpOnly":false,"Persistent":false,"HostOnly":false,"Expires":"9999-12-31T23:59:59Z","Creation":"2026-01-31T23:45:49.5613454+08:00","LastAccess":"2026-01-31T23:45:49.5613454+08:00","Updated":"2026-01-31T23:45:49.5613454+08:00","CanonicalHost":"baidu.com"},{"Name":"logged_in","Value":"yes","Domain":"github.com","Path":"/","Secure":false,"HttpOnly":false,"Persistent":false,"HostOnly":false,"Expires":"9999-12-31T23:59:59Z","Creation":"2026-01-31T23:45:49.5613454+08:00","LastAccess":"2026-01-31T23:45:49.5613454+08:00","Updated":"2026-01-31T23:45:49.5613454+08:00","CanonicalHost":"github.com"},{"Name":"user_session","Value":"gh_tok_12345","Domain":"github.com","Path":"/","Secure":false,"HttpOnly":false,"Persistent":false,"HostOnly":false,"Expires":"9999-12-31T23:59:59Z","Creation":"2026-01-31T23:45:49.5613454+08:00","LastAccess":"2026-01-31T23:45:49.5613454+08:00","Updated":"2026-01-31T23:45:49.5613454+08:00","CanonicalHost":"github.com"},{"Name":"SID","Value":"google_session_id","Domain":"google.com","Path":"/","Secure":false,"HttpOnly":false,"Persistent":false,"HostOnly":false,"Expires":"9999-12-31T23:59:59Z","Creation":"2026-01-31T23:45:49.5613454+08:00","LastAccess":"2026-01-31T23:45:49.5613454+08:00","Updated":"2026-01-31T23:45:49.5613454+08:00","CanonicalHost":"google.com"}]`
jar, err := New(nil)
require.NoError(t, err)
err = json.Unmarshal([]byte(jsonData), jar)
require.NoError(t, err)
for _, cookie := range jar.AllCookies() {
t.Log(cookie)
}
}
func TestJar_GobEncode(t *testing.T) {
jar, err := New(nil)
require.NoError(t, err)
{
// --- Mock 域名 A (Google) ---
u1, _ := url.Parse("https://google.com")
cookies1 := []*http.Cookie{
{Name: "SID", Value: "google_session_id", Domain: ".google.com", Path: "/"},
}
jar.SetCookies(u1, cookies1)
// --- Mock 域名 B (GitHub) ---
u2, _ := url.Parse("https://github.com")
cookies2 := []*http.Cookie{
{Name: "logged_in", Value: "yes", Domain: ".github.com", Path: "/"},
{Name: "user_session", Value: "gh_tok_12345", Domain: ".github.com", Path: "/"},
}
jar.SetCookies(u2, cookies2)
// --- Mock 域名 C (Baidu) ---
u3, _ := url.Parse("https://baidu.com")
cookies3 := []*http.Cookie{
{Name: "BDUSS", Value: "baidu_token_xyz", Domain: ".baidu.com", Path: "/"},
}
jar.SetCookies(u3, cookies3)
}
buf := new(bytes.Buffer)
encoder := gob.NewEncoder(buf)
err = encoder.Encode(jar)
require.NoError(t, err)
t.Log(base64.StdEncoding.EncodeToString(buf.Bytes()))
}
func TestJar_GobDecode(t *testing.T) {
const gobBase64Data = `CX8FAQL/ggAAAP4CwP+AAP4Cug3/hwIBAv+IAAH/hAAA/7j/gwMBAQVlbnRyeQH/hAABDQEETmFtZQEMAAEFVmFsdWUBDAABBkRvbWFpbgEMAAEEUGF0aAEMAAEGU2VjdXJlAQIAAQhIdHRwT25seQECAAEKUGVyc2lzdGVudAECAAEISG9zdE9ubHkBAgABB0V4cGlyZXMB/4YAAQhDcmVhdGlvbgH/hgABCkxhc3RBY2Nlc3MB/4YAAQdVcGRhdGVkAf+GAAENQ2Fub25pY2FsSG9zdAEMAAAAEP+FBQEBBFRpbWUB/4YAAAD+Ad7/iAAEAQVCRFVTUwEPYmFpZHVfdG9rZW5feHl6AQliYWlkdS5jb20BAS8FDwEAAABJd4Y4fwAAAAD//wEPAQAAAA7hEByANerCQAHgAQ8BAAAADuEQHIA16sJAAeABDwEAAAAO4RAcgDXqwkAB4AEJYmFpZHUuY29tAAEJbG9nZ2VkX2luAQN5ZXMBCmdpdGh1Yi5jb20BAS8FDwEAAABJd4Y4fwAAAAD//wEPAQAAAA7hEByANerCQAHgAQ8BAAAADuEQHIA16sJAAeABDwEAAAAO4RAcgDXqwkAB4AEKZ2l0aHViLmNvbQABDHVzZXJfc2Vzc2lvbgEMZ2hfdG9rXzEyMzQ1AQpnaXRodWIuY29tAQEvBQ8BAAAASXeGOH8AAAAA//8BDwEAAAAO4RAcgDXqwkAB4AEPAQAAAA7hEByANerCQAHgAQ8BAAAADuEQHIA16sJAAeABCmdpdGh1Yi5jb20AAQNTSUQBEWdvb2dsZV9zZXNzaW9uX2lkAQpnb29nbGUuY29tAQEvBQ8BAAAASXeGOH8AAAAA//8BDwEAAAAO4RAcgDXqwkAB4AEPAQAAAA7hEByANerCQAHgAQ8BAAAADuEQHIA16sJAAeABCmdvb2dsZS5jb20A`
jar, err := New(nil)
require.NoError(t, err)
gobData, err := base64.StdEncoding.DecodeString(gobBase64Data)
require.NoError(t, err)
decoder := gob.NewDecoder(bytes.NewReader(gobData))
err = decoder.Decode(jar)
require.NoError(t, err)
for _, cookie := range jar.AllCookies() {
t.Log(cookie)
}
}