Skip to content

cookiejar is a fork of net/http/cookiejar that allows serialisation of the stored cookies

License

Notifications You must be signed in to change notification settings

kaylee595/cookiejar

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cookiejar

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)
	}
}

About

cookiejar is a fork of net/http/cookiejar that allows serialisation of the stored cookies

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Go 100.0%