Skip to content

nhatthm/go-cookiejar

Repository files navigation

Cookiejar

GitHub Releases Build Status codecov Go Report Card GoDevDoc Donate

The Persistent Cookiejar is a fork of net/http/cookiejar which also implements methods for persisting the cookies to a filesystem and retrieving them using spf13/afero

Prerequisites

  • Go >= 1.20

Install

go get go.nhat.io/cookiejar

Usage

Construct the cookiejar with the following options:

Option Description Default Value
WithFilePath The path to the file to store the cookies "cookies.json"
WithFilePerm The file permission to use for persisting the cookies 0600
WithAutoSync Whether to automatically sync the cookies to the file after each request false
WithLogger The logger to use for logging No log
WithFs The filesystem to use for persisting the cookies afero.NewOsFs()
WithSerDer The serializer/deserializer to use for persisting the cookies json
WithPublicSuffixList The public suffix list to use for cookie domain matching
All users of cookiejar should import golang.org/x/net/publicsuffix
nil

Example:

package example

import (
	"net/http"

	"go.nhat.io/cookiejar"
)

func newClient() *http.Client {
	jar := cookiejar.NewPersistentJar(
		cookiejar.WithFilePath("/path/to/cookies.json"),
		cookiejar.WithFilePerm(0755),
		cookiejar.WithAutoSync(true),
	)

	return &http.Client{
		Jar: jar,
	}
}

Examples

package cookiejar_test

import (
	"fmt"
	"log"
	"net/http"
	"net/http/httptest"
	"net/url"
	"os"
	"path/filepath"

	"go.nhat.io/cookiejar"
)

func ExampleNewPersistentJar() {
	tempDir, err := os.MkdirTemp(os.TempDir(), "example")
	if err != nil {
		log.Fatal(err)
	}

	defer os.RemoveAll(tempDir)

	cookiesFile := filepath.Join(tempDir, "cookies")

	// Start a server to give us cookies.
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if cookie, err := r.Cookie("Flavor"); err != nil {
			http.SetCookie(w, &http.Cookie{Name: "Flavor", Value: "Chocolate Chip"})
		} else {
			cookie.Value = "Oatmeal Raisin"
			http.SetCookie(w, cookie)
		}
	}))
	defer ts.Close()

	u, err := url.Parse(ts.URL)
	if err != nil {
		log.Fatal(err)
	}

	jar := cookiejar.NewPersistentJar(
		cookiejar.WithFilePath(cookiesFile),
		cookiejar.WithAutoSync(true),
		// All users of cookiejar should import "golang.org/x/net/publicsuffix"
		cookiejar.WithPublicSuffixList(publicsuffix.List),
	)

	client := &http.Client{
		Jar: jar,
	}

	if _, err = client.Get(u.String()); err != nil {
		log.Fatal(err)
	}

	fmt.Println("After 1st request:")
	for _, cookie := range jar.Cookies(u) {
		fmt.Printf("  %s: %s\n", cookie.Name, cookie.Value)
	}

	if _, err = client.Get(u.String()); err != nil {
		log.Fatal(err)
	}

	fmt.Println("After 2nd request:")
	for _, cookie := range jar.Cookies(u) {
		fmt.Printf("  %s: %s\n", cookie.Name, cookie.Value)
	}

	// Output:
	// After 1st request:
	//   Flavor: Chocolate Chip
	// After 2nd request:
	//   Flavor: Oatmeal Raisin
}

Donation

If this project help you reduce time to develop, you can give me a cup of coffee :)

Paypal donation

paypal

       or scan this