Add cookie convenience funcs

Fix test helper func
This commit is contained in:
y a t s
2026-06-18 11:44:25 -04:00
parent 72840af90e
commit 92438691f1
5 changed files with 49 additions and 37 deletions
+3 -5
View File
@@ -123,16 +123,14 @@ func (kf *KF) TwoFactorAuth(ctx context.Context, resp *http.Response, code uint3
} }
func (kf *KF) IsLoggedIn() bool { func (kf *KF) IsLoggedIn() bool {
return getCookie(kf.client.Jar, kf.domain, "xf_user") != nil return kf.Cookies.GetCookie(kf.domain, "xf_user") != nil
} }
func (kf *KF) RefreshSession(ctx context.Context) (string, error) { func (kf *KF) RefreshSession(ctx context.Context) (string, error) {
const COOKIE_NAME = "xf_session" const COOKIE_NAME = "xf_session"
jar := kf.client.Jar
// Clear any existing session token to request a new one. // Clear any existing session token to request a new one.
setCookie(jar, kf.domain, &http.Cookie{ kf.Cookies.SetCookie(kf.domain, &http.Cookie{
Name: COOKIE_NAME, Name: COOKIE_NAME,
Value: "", Value: "",
}) })
@@ -143,7 +141,7 @@ func (kf *KF) RefreshSession(ctx context.Context) (string, error) {
} }
resp.Body.Close() resp.Body.Close()
session := getCookie(jar, kf.domain, COOKIE_NAME) session := kf.Cookies.GetCookie(kf.domain, COOKIE_NAME)
if session == nil { if session == nil {
return "", errors.New("Failed to get new xf_session cookie.") return "", errors.New("Failed to get new xf_session cookie.")
} }
+38
View File
@@ -0,0 +1,38 @@
package libkiwi
import (
"net/http"
"net/url"
)
// http.CookieJar interface wrapper to add convenience functions.
type jar struct {
http.CookieJar
}
func (j *jar) GetCookie(u *url.URL, name string) *http.Cookie {
cookies := j.Cookies(u)
for _, c := range cookies {
if c.Name == name {
return c
}
}
return nil
}
func (j *jar) SetCookie(u *url.URL, newCookie *http.Cookie) {
cookies := j.Cookies(u)
for i, c := range cookies {
if c.Name == newCookie.Name {
cookies[i] = newCookie
j.SetCookies(u, cookies)
return
}
}
// Append if not already existing.
cookies = append(cookies, newCookie)
j.SetCookies(u, cookies)
}
-27
View File
@@ -14,33 +14,6 @@ import (
"golang.org/x/net/html/atom" "golang.org/x/net/html/atom"
) )
func getCookie(jar http.CookieJar, u *url.URL, name string) *http.Cookie {
cookies := jar.Cookies(u)
for _, c := range cookies {
if c.Name == name {
return c
}
}
return nil
}
func setCookie(jar http.CookieJar, u *url.URL, newCookie *http.Cookie) {
cookies := jar.Cookies(u)
for i, c := range cookies {
if c.Name == newCookie.Name {
cookies[i] = newCookie
jar.SetCookies(u, cookies)
return
}
}
// Append if not already existing.
cookies = append(cookies, newCookie)
jar.SetCookies(u, cookies)
}
// Get XFToken (data-csrf) from page html. // Get XFToken (data-csrf) from page html.
func XFToken(page io.Reader) (string, error) { func XFToken(page io.Reader) (string, error) {
z := html.NewTokenizer(page) z := html.NewTokenizer(page)
+3
View File
@@ -18,6 +18,8 @@ const _USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefo
type KF struct { type KF struct {
client http.Client client http.Client
domain *url.URL domain *url.URL
Cookies jar
} }
// Supply your own http.Client to route through any proxies. // Supply your own http.Client to route through any proxies.
@@ -39,6 +41,7 @@ func NewKF(hc http.Client, host *url.URL) (KF, error) {
return KF{ return KF{
client: hc, client: hc,
domain: u, domain: u,
Cookies: jar{hc.Jar},
}, nil }, nil
} }
+3 -3
View File
@@ -58,7 +58,7 @@ func TestGetPost(t *testing.T) {
t.Logf("Post text: %s\n", post.TextContent()) t.Logf("Post text: %s\n", post.TextContent())
} }
func newTestKF() (*KF, error) { func newTestKF() (KF, error) {
host := os.Getenv("TEST_HOST") host := os.Getenv("TEST_HOST")
if host == "" { if host == "" {
host = _TEST_HOST host = _TEST_HOST
@@ -66,7 +66,7 @@ func newTestKF() (*KF, error) {
u, err := url.Parse("https://" + host) u, err := url.Parse("https://" + host)
if err != nil { if err != nil {
return nil, err return KF{}, err
} }
p := proxy.FromEnvironment() p := proxy.FromEnvironment()
@@ -76,7 +76,7 @@ func newTestKF() (*KF, error) {
jar, err := cookiejar.New(nil) jar, err := cookiejar.New(nil)
if err != nil { if err != nil {
return nil, err return KF{}, err
} }
hc := http.Client{ hc := http.Client{