Categorygithub.com/Arthur1/http-client-cache
modulepackage
0.1.1
Repository: https://github.com/arthur1/http-client-cache.git
Documentation: pkg.go.dev

# README

http-client-cache

http-client-cache is a Go library for transparent HTTP client-side caching using Transport.

Under the standard configuration, the request is retrieved from cache if the request URL, method, and body match.

Only Redis is currently supported as a cache backend.

Usage

redisCli := redis.NewClient(&redis.Options{Addr: "localhost:6379", DB: 0})
transport := httpclientcache.NewTransport(
	rediscache.New(redisCli),
	httpclientcache.WithExpiration(5*time.Minute),
)
client := &http.Client{Transport: transport}

Example

import (
	"log/slog"
	"net/http"
	"net/http/httputil"
	"time"

	httpclientcache "github.com/Arthur1/http-client-cache"
	"github.com/Arthur1/http-client-cache/cache/engine/rediscache"
	"github.com/Arthur1/http-client-cache/cache/key"
	"github.com/redis/go-redis/v9"
)

func main() {
	redisCli := redis.NewClient(&redis.Options{Addr: "localhost:6379", DB: 0})
	transport := httpclientcache.NewTransport(
        // By changing the argument of NewKeyGenerator, the cache space can be separated by such as user.
		rediscache.New(redisCli, rediscache.WithKeyGenerator(key.NewKeyGenerator("**userid**"))),
		httpclientcache.WithExpiration(5*time.Minute),
	)
	client := &http.Client{Transport: transport}

	req1, _ := http.NewRequest(http.MethodGet, "https://example.com", nil)
	res1, _ := client.Do(req1) // fetch from origin
	resd1, _ := httputil.DumpResponse(res1, false)
	slog.Info("res1", slog.String("response", string(resd1)))

	req2, _ := http.NewRequest(http.MethodGet, "https://example.com", nil)
	res2, _ := client.Do(req2) // fetch from cache
	resd2, _ := httputil.DumpResponse(res2, false)
	slog.Info("res2", slog.String("response", string(resd2)))

	time.Sleep(5 * time.Minute)

	req3, _ := http.NewRequest(http.MethodGet, "https://example.com", nil)
	res3, _ := client.Do(req3) // fetch from origin
	resd3, _ := httputil.DumpResponse(res3, false)
	slog.Info("res3", slog.String("response", string(resd3)))
}

# Packages

No description provided by the author

# Functions

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Structs

No description provided by the author

# Interfaces

No description provided by the author