Documentation
¶
Overview ¶
Package httpcache provides an implementation of http.RoundTripper that adds transparent HTTP response caching according to RFC 9111 (HTTP Caching).
The main entry point is NewTransport, which returns an http.RoundTripper for use with http.Client. httpcache supports the required standard HTTP caching directives, as well as extension directives such as stale-while-revalidate and stale-if-error.
Example usage:
package main
import (
"log/slog"
"net/http"
"time"
"github.com/bartventer/httpcache"
// Register a cache backend by importing the package
_ "github.com/bartventer/httpcache/store/fscache"
)
func main() {
dsn := "fscache://?appname=myapp" // // Example DSN for the file system cache backend
client := &http.Client{
Transport: httpcache.NewTransport(
dsn,
httpcache.WithSWRTimeout(10*time.Second),
httpcache.WithLogger(slog.Default()),
),
}
}
Index ¶
Constants ¶
const CacheStatusHeader = internal.CacheStatusHeader
const DefaultSWRTimeout = 5 * time.Second // Default timeout for Stale-While-Revalidate
Variables ¶
var ErrNilCache = errors.New("httpcache: cache cannot be nil")
ErrNilCache is returned when a nil cache is provided to [NewRoundTripper]. Although not recommended, it is possible to handle this error gracefully by recovering from the panic that occurs when a nil cache is passed.
Example usage:
defer func() {
if r := recover(); r != nil {
if err, ok := r.(error); ok && errors.Is(err, ErrNilCache) {
// Handle the error gracefully, e.g., log it or return a default transport
log.Println("Cache cannot be nil:", err)
client := &http.Client{
Transport: http.DefaultTransport, // Fallback to default transport
}
// Use the fallback client as needed
_ = client
} else {
// Re-panic if it's not the expected error
panic(r)
}
}
}()
Functions ¶
func NewTransport ¶
func NewTransport(dsn string, options ...Option) http.RoundTripper
NewTransport returns an http.RoundTripper that caches HTTP responses using the specified cache backend.
The backend is selected via a DSN (e.g., "memcache://", "fscache://"). Panics if the cache cannot be opened or is nil. A blank import is required to register the cache backend.
To configure the transport, you can use functional options such as WithTransport, WithSWRTimeout, and WithLogger.
Types ¶
type Option ¶
type Option interface {
// contains filtered or unexported methods
}
Option is a functional option for configuring the RoundTripper.
func WithLogger ¶
WithLogger sets the logger for debug output; default: slog.New(slog.DiscardHandler).
func WithSWRTimeout ¶
WithSWRTimeout sets the timeout for Stale-While-Revalidate requests; default: DefaultSWRTimeout.
func WithTransport ¶
func WithTransport(transport http.RoundTripper) Option
WithTransport sets the underlying HTTP transport for making requests; default: http.DefaultTransport.
Directories
¶
| Path | Synopsis |
|---|---|
|
_examples
|
|
|
app
command
|
|
|
testutil
Package testutil provides utility functions for testing in Go.
|
Package testutil provides utility functions for testing in Go. |
|
Package store defines interfaces to be implemented by cache backends as used by the github.com/bartventer/httpcache package.
|
Package store defines interfaces to be implemented by cache backends as used by the github.com/bartventer/httpcache package. |
|
acceptance
Package acceptancetest provides a suite of acceptance tests for Cache implementations.
|
Package acceptancetest provides a suite of acceptance tests for Cache implementations. |
|
fscache
Package fscache implements a file system-based store.Cache.
|
Package fscache implements a file system-based store.Cache. |
|
memcache
Package memcache provides an in-memory implementation of store.Cache.
|
Package memcache provides an in-memory implementation of store.Cache. |
