Skip to content

Commit b343028

Browse files
http.Client with TTL
1 parent 8da4a24 commit b343028

3 files changed

Lines changed: 23 additions & 11 deletions

File tree

http/http.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"database/sql"
66
"io"
77
"net/http"
8+
"time"
89

910
"github.com/walterwanderley/sqlite-http-cache/http/internal"
1011
)
@@ -20,6 +21,7 @@ type Config struct {
2021
DB *sql.DB
2122
Tables []string
2223
ReadOnly bool
24+
TTL time.Duration
2325
}
2426

2527
func (c Config) Client(ctx context.Context) (*http.Client, io.Closer, error) {
@@ -29,9 +31,9 @@ func (c Config) Client(ctx context.Context) (*http.Client, io.Closer, error) {
2931
err error
3032
)
3133
if c.ReadOnly {
32-
t, err = newReadOnlyTransport(cc.Transport, c.DB, c.Tables...)
34+
t, err = newReadOnlyTransport(cc.Transport, c.DB, c.TTL, c.Tables...)
3335
} else {
34-
t, err = newReadWriteTransport(cc.Transport, c.DB, c.Tables...)
36+
t, err = newReadWriteTransport(cc.Transport, c.DB, c.TTL, c.Tables...)
3537
}
3638
if err != nil {
3739
return nil, nil, err

http/ro_transport.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"net/http"
9+
"time"
910

1011
"github.com/walterwanderley/sqlite-http-cache/db"
1112
)
@@ -18,9 +19,10 @@ type readOnlyTransportQuerier interface {
1819
type readOnlyTransport struct {
1920
base http.RoundTripper
2021
querier readOnlyTransportQuerier
22+
ttl time.Duration
2123
}
2224

23-
func newReadOnlyTransport(base http.RoundTripper, sqlDB *sql.DB, tableNames ...string) (*readOnlyTransport, error) {
25+
func newReadOnlyTransport(base http.RoundTripper, sqlDB *sql.DB, ttl time.Duration, tableNames ...string) (*readOnlyTransport, error) {
2426
if base == nil {
2527
base = http.DefaultTransport.(*http.Transport).Clone()
2628
}
@@ -31,6 +33,7 @@ func newReadOnlyTransport(base http.RoundTripper, sqlDB *sql.DB, tableNames ...s
3133
return &readOnlyTransport{
3234
base: base,
3335
querier: querier,
36+
ttl: ttl,
3437
}, nil
3538
}
3639

@@ -41,7 +44,7 @@ func (t *readOnlyTransport) RoundTrip(req *http.Request) (*http.Response, error)
4144

4245
url := req.URL.String()
4346
resp, err := t.querier.FindByURL(req.Context(), url)
44-
if err != nil {
47+
if err != nil || time.Since(resp.Timestamp) > t.ttl {
4548
return t.base.RoundTrip(req)
4649
}
4750

http/rw_transport.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"database/sql"
66
"fmt"
77
"net/http"
8+
"time"
89

910
"github.com/walterwanderley/sqlite-http-cache/db"
1011
)
@@ -17,9 +18,10 @@ type readWriteTransportQuerier interface {
1718
type readWriteTransport struct {
1819
base http.RoundTripper
1920
querier readWriteTransportQuerier
21+
ttl time.Duration
2022
}
2123

22-
func newReadWriteTransport(base http.RoundTripper, sqlDB *sql.DB, tableNames ...string) (*readWriteTransport, error) {
24+
func newReadWriteTransport(base http.RoundTripper, sqlDB *sql.DB, ttl time.Duration, tableNames ...string) (*readWriteTransport, error) {
2325
if base == nil {
2426
base = http.DefaultTransport.(*http.Transport).Clone()
2527
}
@@ -30,6 +32,7 @@ func newReadWriteTransport(base http.RoundTripper, sqlDB *sql.DB, tableNames ...
3032
return &readWriteTransport{
3133
base: base,
3234
querier: querier,
35+
ttl: ttl,
3336
}, nil
3437
}
3538

@@ -39,19 +42,23 @@ func (t *readWriteTransport) RoundTrip(req *http.Request) (*http.Response, error
3942
}
4043

4144
url := req.URL.String()
42-
resp, err := t.querier.FindByURL(req.Context(), url)
43-
if err != nil {
45+
respDB, err := t.querier.FindByURL(req.Context(), url)
46+
if err != nil || time.Since(respDB.Timestamp) > t.ttl {
4447
resp, err := t.base.RoundTrip(req)
4548
if err == nil {
46-
49+
newRespDB, err := db.HttpToResponse(resp)
50+
if err == nil {
51+
newRespDB.TableName = respDB.TableName
52+
t.querier.Write(context.Background(), url, newRespDB)
53+
}
4754
}
4855
return resp, err
4956
}
5057

5158
return &http.Response{
52-
StatusCode: resp.Status,
53-
Body: resp.Body,
54-
Header: http.Header(resp.Headers),
59+
StatusCode: respDB.Status,
60+
Body: respDB.Body,
61+
Header: http.Header(respDB.Headers),
5562
}, nil
5663

5764
}

0 commit comments

Comments
 (0)