Documentation
¶
Overview ¶
Example (InMemoryStorageDefault) ¶
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
"github.com/bxcodec/httpcache"
)
func main() {
client := &http.Client{}
handler, err := httpcache.NewWithInmemoryCache(client, true, time.Second*15)
if err != nil {
log.Fatal(err)
}
processCachedRequest(client, handler)
// Example Output:
/*
2020/06/21 13:14:51 Cache item's missing failed to retrieve from cache, trying with a live version
Response time: 940086 micro-second
Status Code 200
Sequence >>> 0
2020/06/21 13:14:53 Cache item's missing failed to retrieve from cache, trying with a live version
Response time: 73679 micro-second
Status Code 200
Sequence >>> 1
Response time: 126 micro-second
Status Code 200
Sequence >>> 2
Response time: 96 micro-second
Status Code 200
Sequence >>> 3
Response time: 102 micro-second
Status Code 200
Sequence >>> 4
Response time: 94 micro-second
Status Code 200
Sequence >>> 5
*/
}
func processCachedRequest(client *http.Client, handler *httpcache.CacheHandler) {
for i := 0; i < 100; i++ {
startTime := time.Now()
req, err := http.NewRequestWithContext(context.TODO(), "GET", "https://imantumorang.com", http.NoBody)
if err != nil {
log.Fatal((err))
}
res, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Response time: %v micro-second\n", time.Since(startTime).Microseconds())
fmt.Println("Status Code", res.StatusCode)
time.Sleep(time.Second * 1)
fmt.Println("Sequence >>> ", i)
if i%5 == 0 {
err := handler.CacheInteractor.Flush()
if err != nil {
log.Fatal(err)
}
}
res.Body.Close()
}
}
Example (RedisStorage) ¶
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
"github.com/bxcodec/httpcache"
"github.com/bxcodec/httpcache/cache/redis"
)
func main() {
client := &http.Client{}
handler, err := httpcache.NewWithRedisCache(client, true, &redis.CacheOptions{
Addr: "localhost:6379",
}, time.Second*15)
if err != nil {
log.Fatal(err)
}
processCachedRequest(client, handler)
// Example Output:
/*
2020/06/21 13:14:51 Cache item's missing failed to retrieve from cache, trying with a live version
Response time: 940086 micro-second
Status Code 200
Sequence >>> 0
2020/06/21 13:14:53 Cache item's missing failed to retrieve from cache, trying with a live version
Response time: 73679 micro-second
Status Code 200
Sequence >>> 1
Response time: 126 micro-second
Status Code 200
Sequence >>> 2
Response time: 96 micro-second
Status Code 200
Sequence >>> 3
Response time: 102 micro-second
Status Code 200
Sequence >>> 4
Response time: 94 micro-second
Status Code 200
Sequence >>> 5
*/
}
func processCachedRequest(client *http.Client, handler *httpcache.CacheHandler) {
for i := 0; i < 100; i++ {
startTime := time.Now()
req, err := http.NewRequestWithContext(context.TODO(), "GET", "https://imantumorang.com", http.NoBody)
if err != nil {
log.Fatal((err))
}
res, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Response time: %v micro-second\n", time.Since(startTime).Microseconds())
fmt.Println("Status Code", res.StatusCode)
time.Sleep(time.Second * 1)
fmt.Println("Sequence >>> ", i)
if i%5 == 0 {
err := handler.CacheInteractor.Flush()
if err != nil {
log.Fatal(err)
}
}
res.Body.Close()
}
}
Example (WithCustomStorage) ¶
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
"github.com/bxcodec/httpcache"
"github.com/bxcodec/httpcache/cache"
patrickCache "github.com/patrickmn/go-cache"
)
type customInMemStorage struct {
cacheHandler *patrickCache.Cache
}
// NewCustomInMemStorage will return a custom in memory cache
func NewCustomInMemStorage() cache.ICacheInteractor {
return &customInMemStorage{
cacheHandler: patrickCache.New(patrickCache.DefaultExpiration, time.Second*10),
}
}
func (c customInMemStorage) Set(key string, value cache.CachedResponse) error { //nolint
c.cacheHandler.Set(key, value, patrickCache.DefaultExpiration)
return nil
}
func (c customInMemStorage) Get(key string) (res cache.CachedResponse, err error) {
cachedRes, ok := c.cacheHandler.Get(key)
if !ok {
err = cache.ErrCacheMissed
return
}
res, ok = cachedRes.(cache.CachedResponse)
if !ok {
err = cache.ErrInvalidCachedResponse
return
}
return
}
func (c customInMemStorage) Delete(key string) error {
c.cacheHandler.Delete(key)
return nil
}
func (c customInMemStorage) Flush() error {
c.cacheHandler.Flush()
return nil
}
func (c customInMemStorage) Origin() string {
return "MY-OWN-CUSTOM-INMEMORY-CACHED"
}
func main() {
client := &http.Client{}
handler, err := httpcache.NewWithCustomStorageCache(client, true, NewCustomInMemStorage())
if err != nil {
log.Fatal(err)
}
for i := 0; i < 100; i++ {
startTime := time.Now()
req, err := http.NewRequestWithContext(context.TODO(), "GET", "https://imantumorang.com", http.NoBody)
if err != nil {
log.Fatal((err))
}
res, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Response time: %v micro-second\n", time.Since(startTime).Microseconds())
fmt.Println("Status Code", res.StatusCode)
time.Sleep(time.Second * 1)
fmt.Println("Sequence >>> ", i)
if i%5 == 0 {
err := handler.CacheInteractor.Flush()
if err != nil {
log.Fatal(err)
}
}
res.Body.Close()
}
// Example Output:
/*
2020/06/21 13:14:51 Cache item's missing failed to retrieve from cache, trying with a live version
Response time: 940086 micro-second
Status Code 200
Sequence >>> 0
2020/06/21 13:14:53 Cache item's missing failed to retrieve from cache, trying with a live version
Response time: 73679 micro-second
Status Code 200
Sequence >>> 1
Response time: 126 micro-second
Status Code 200
Sequence >>> 2
Response time: 96 micro-second
Status Code 200
Sequence >>> 3
Response time: 102 micro-second
Status Code 200
Sequence >>> 4
Response time: 94 micro-second
Status Code 200
Sequence >>> 5
*/
}
Index ¶
- Constants
- type CacheHandler
- func NewCacheHandlerRoundtrip(defaultRoundTripper http.RoundTripper, rfcCompliance bool, ...) *CacheHandler
- func NewWithCustomStorageCache(client *http.Client, rfcCompliance bool, ...) (cacheHandler *CacheHandler, err error)
- func NewWithInmemoryCache(client *http.Client, rfcCompliance bool, duration ...time.Duration) (cachedHandler *CacheHandler, err error)
- func NewWithRedisCache(client *http.Client, rfcCompliance bool, options *rediscache.CacheOptions, ...) (cachedHandler *CacheHandler, err error)
Examples ¶
Constants ¶
const ( HeaderAuthorization = "Authorization" HeaderCacheControl = "Cache-Control" // To indicate that the response is got from this httpcache library XFromHache = "X-HTTPCache" XHacheOrigin = "X-HTTPCache-Origin" )
Headers
const (
MaxSizeCacheItem = 100
)
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CacheHandler ¶
type CacheHandler struct {
DefaultRoundTripper http.RoundTripper
CacheInteractor cache.ICacheInteractor
ComplyRFC bool
}
CacheHandler custom plugable' struct of implementation of the http.RoundTripper
func NewCacheHandlerRoundtrip ¶
func NewCacheHandlerRoundtrip(defaultRoundTripper http.RoundTripper, rfcCompliance bool, cacheActor cache.ICacheInteractor) *CacheHandler
NewCacheHandlerRoundtrip will create an implementations of cache http roundtripper
func NewWithCustomStorageCache ¶
func NewWithCustomStorageCache(client *http.Client, rfcCompliance bool, cacheInteractor cache.ICacheInteractor) (cacheHandler *CacheHandler, err error)
NewWithCustomStorageCache will initiate the httpcache with your defined cache storage To use your own cache storage handler, you need to implement the cache.Interactor interface And pass it to httpcache.
func NewWithInmemoryCache ¶
func NewWithInmemoryCache(client *http.Client, rfcCompliance bool, duration ...time.Duration) (cachedHandler *CacheHandler, err error)
NewWithInmemoryCache will create a complete cache-support of HTTP client with using inmemory cache. If the duration not set, the cache will use LFU algorithm
func NewWithRedisCache ¶
func NewWithRedisCache(client *http.Client, rfcCompliance bool, options *rediscache.CacheOptions, duration ...time.Duration) (cachedHandler *CacheHandler, err error)
NewWithRedisCache will create a complete cache-support of HTTP client with using redis cache. If the duration not set, the cache will use LFU algorithm
func (*CacheHandler) RFC7234Compliance ¶
func (r *CacheHandler) RFC7234Compliance(val bool) *CacheHandler
RFC7234Compliance used for enable/disable the RFC 7234 compliance