diff --git a/go.mod b/go.mod index 226d781..e589003 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,8 @@ module github.com/y-a-t-s/libkiwi -go 1.23.3 +go 1.25.6 -require ( - github.com/y-a-t-s/firebird v0.0.0-20240927151147-c1c3219d176b - github.com/y-a-t-s/kiwijar v0.0.0-20241202190418-813d7ca625d8 -) +require github.com/y-a-t-s/firebird v0.0.0-20251115152558-29bf6ad7c90b require ( github.com/klauspost/cpuid/v2 v2.2.3 // indirect diff --git a/go.sum b/go.sum index 25eb5ae..b234a28 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,8 @@ github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y7 github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/y-a-t-s/firebird v0.0.0-20240927151147-c1c3219d176b h1:zX9Hj9mK7cSExqPUxdO2LS0OsEpflRqGu94yC1BuDfU= -github.com/y-a-t-s/firebird v0.0.0-20240927151147-c1c3219d176b/go.mod h1:aq9EHq1B6MDC0RdIRbcFHI5SsGaeztoMjL7tRdgJCAQ= -github.com/y-a-t-s/kiwijar v0.0.0-20241202190418-813d7ca625d8 h1:0PX2ayEHWoVubMT+IKdupf29q538szmBmdzCn30fJuA= -github.com/y-a-t-s/kiwijar v0.0.0-20241202190418-813d7ca625d8/go.mod h1:3FWsCf08sDaZGUA0yXpwWSvIfYUFvuOL7Q1fftseDjc= +github.com/y-a-t-s/firebird v0.0.0-20251115152558-29bf6ad7c90b h1:tAqjNda25c1SpnoDmDx5b1KIuN0VTgskoU4shwSMdFI= +github.com/y-a-t-s/firebird v0.0.0-20251115152558-29bf6ad7c90b/go.mod h1:/qomDTP1XQRFc0TLzcf0Y5wMHftgl5z40PAb9aTxXGg= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/libkiwi.go b/libkiwi.go index 0eac4ed..eb83750 100644 --- a/libkiwi.go +++ b/libkiwi.go @@ -2,13 +2,14 @@ package libkiwi import ( "context" + "errors" "net/http" + "net/http/cookiejar" "net/url" "regexp" "strings" "github.com/y-a-t-s/firebird" - "github.com/y-a-t-s/kiwijar" ) type KF struct { @@ -23,9 +24,18 @@ func NewKF(hc http.Client, host string, cookies string) (kf *KF, err error) { return } - jar := kiwijar.KiwiJar{} - jar.ParseString(u, cookies) - hc.Jar = &jar + jar, err := cookiejar.New(nil) + if err != nil { + return nil, err + } + + cs, err := parseCookieString(u, cookies) + if err != nil { + return nil, err + } + + jar.SetCookies(u, cs) + hc.Jar = jar kf = &KF{ Client: hc, @@ -47,19 +57,19 @@ func NewKF(hc http.Client, host string, cookies string) (kf *KF, err error) { return } -func (kf *KF) GetPage(ctx context.Context, u *url.URL) (resp *http.Response, err error) { +func (kf *KF) GetPage(ctx context.Context, u *url.URL) (*http.Response, error) { req, err := http.NewRequestWithContext(ctx, "GET", u.String(), nil) if err != nil { - return + return nil, err } - resp, err = kf.Client.Do(req) + resp, err := kf.Client.Do(req) if err != nil { - return + return nil, err } hn := resp.Request.URL.Hostname() if hn != kf.domain.Hostname() { - jar := kf.Client.Jar.(*kiwijar.KiwiJar) + jar := kf.Client.Jar jar.SetCookies(resp.Request.URL, jar.Cookies(kf.domain)) kf.domain.Host = hn } @@ -68,30 +78,67 @@ func (kf *KF) GetPage(ctx context.Context, u *url.URL) (resp *http.Response, err if resp.StatusCode == 203 { err = kf.solveKiwiFlare(ctx) if err != nil { - return + return nil, err } // Try fetching the page again now that we're authed. return kf.GetPage(ctx, u) } - return + return resp, nil } -func (kf *KF) RefreshSession(ctx context.Context) (tk string, err error) { +func parseCookieString(u *url.URL, cookies string) ([]*http.Cookie, error) { + sp := strings.Split(cookies, "; ") + cs := make([]*http.Cookie, len(sp)) + + for i, c := range sp { + kv := strings.Split(c, "=") + if len(kv) != 2 { + return nil, errors.New("Invalid cookie string: " + cookies) + } + cs[i] = &http.Cookie{ + Domain: u.Hostname(), + Name: kv[0], + Path: "/", + Value: kv[1], + } + } + + return cs, nil +} + +func setCookie(jar http.CookieJar, u *url.URL, cookie *http.Cookie) { + cookies := jar.Cookies(u) + found := false + for i, c := range cookies { + if c.Name == cookie.Name { + cookies[i] = cookie + found = true + break + } + } + + if !found { + cookies = append(cookies, cookie) + } + + jar.SetCookies(u, cookies) +} + +func (kf *KF) RefreshSession(ctx context.Context) (string, error) { // Clear any existing session token to request a new one. - kf.Client.Jar.(*kiwijar.KiwiJar).SetCookie(kf.domain, &http.Cookie{ + setCookie(kf.Client.Jar, kf.domain, &http.Cookie{ Name: "xf_session", Value: "", }) resp, err := kf.GetPage(ctx, kf.domain) if err != nil { - return + return "", err } defer resp.Body.Close() - tk = regexp.MustCompile(`xf_session=([^;]*)`).FindString(resp.Header.Get("Set-Cookie")) - return + return regexp.MustCompile(`xf_session=([^;]*)`).FindString(resp.Header.Get("Set-Cookie")), nil } func (kf *KF) solveKiwiFlare(ctx context.Context) error { diff --git a/libkiwi_test.go b/libkiwi_test.go index 4ec01e9..8d951d4 100644 --- a/libkiwi_test.go +++ b/libkiwi_test.go @@ -1,13 +1,10 @@ package libkiwi import ( - "context" "log" "net/http" "os" "testing" - - "github.com/y-a-t-s/kiwijar" ) const TEST_HOST = "kiwifarms.net" @@ -19,13 +16,11 @@ func TestGetPage(t *testing.T) { t.Error(err) } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - log.Println("Getting homepage") - resp, err := kf.GetPage(ctx, kf.domain) + resp, err := kf.GetPage(t.Context(), kf.domain) if err != nil { t.Error(err) + return } defer resp.Body.Close() @@ -36,7 +31,7 @@ func TestGetPage(t *testing.T) { } } log.Printf("Response host: %s\n\n", kf.domain) - log.Printf("Cookies: %s\n", kf.Client.Jar.(*kiwijar.KiwiJar).CookieString(kf.domain)) + log.Printf("Cookies: %+v\n", resp.Cookies()) } func TestRefreshSession(t *testing.T) { @@ -46,24 +41,12 @@ func TestRefreshSession(t *testing.T) { t.Error(err) } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - log.Println("Refreshing xf_session") - tk, err := kf.RefreshSession(ctx) + tk, err := kf.RefreshSession(t.Context()) if err != nil { t.Error(err) + return } log.Println("New xf_session token: " + tk) } - -func TestCookieString(t *testing.T) { - cookies := os.Getenv("TEST_COOKIES") - kf, err := NewKF(http.Client{}, TEST_HOST, cookies) - if err != nil { - t.Error(err) - } - - log.Println("Cookies from jar: " + kf.Client.Jar.(*kiwijar.KiwiJar).CookieString(kf.domain)) -}