refactor: make cookie architecture less crazy

This commit is contained in:
James Houlahan
2020-08-13 11:27:42 +02:00
parent 9f24c666b9
commit 209af59232
4 changed files with 31 additions and 37 deletions

View File

@ -275,7 +275,7 @@ func run(context *cli.Context) (contextError error) { // nolint[funlen]
cm.SetRoundTripper(cfg.GetRoundTripper(cm, eventListener))
// Cookies must be persisted across restarts.
jar, err := cookies.NewCookieJar(cookies.NewPersister(pref))
jar, err := cookies.NewCookieJar(pref)
if err != nil {
logrus.WithError(err).Warn("Could not create cookie jar")
} else {

View File

@ -30,18 +30,25 @@ import (
// Jar implements http.CookieJar by wrapping the standard library's cookiejar.Jar.
// The jar uses a Persister to load cookies at startup and save cookies when set.
type Jar struct {
jar *cookiejar.Jar
persister *Persister
locker sync.Locker
jar *cookiejar.Jar
pantry *pantry
locker sync.Locker
}
func NewCookieJar(persister *Persister) (*Jar, error) {
jar, err := cookiejar.New(nil)
type GetterSetter interface {
Get(string) string
Set(string, string)
}
func NewCookieJar(getterSetter GetterSetter) (*Jar, error) {
pantry := &pantry{prefs: getterSetter}
cookies, err := pantry.loadCookies()
if err != nil {
return nil, err
}
cookies, err := persister.Load()
jar, err := cookiejar.New(nil)
if err != nil {
return nil, err
}
@ -56,9 +63,9 @@ func NewCookieJar(persister *Persister) (*Jar, error) {
}
return &Jar{
jar: jar,
persister: persister,
locker: &sync.Mutex{},
jar: jar,
pantry: pantry,
locker: &sync.Mutex{},
}, nil
}
@ -68,7 +75,7 @@ func (j *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
j.jar.SetCookies(u, cookies)
if err := j.persister.Persist(u.String(), cookies); err != nil {
if err := j.pantry.persistCookies(u.String(), cookies); err != nil {
logrus.WithError(err).Warn("Failed to persist cookie")
}
}

View File

@ -36,7 +36,7 @@ func TestJar(t *testing.T) {
ts := getTestServer(t, testCookies...)
defer ts.Close()
jar, err := NewCookieJar(NewPersister(make(testPersister)))
jar, err := NewCookieJar(make(testGetterSetter))
require.NoError(t, err)
client := &http.Client{Jar: jar}
@ -86,12 +86,12 @@ func getTestServer(t *testing.T, wantCookies ...testCookie) *httptest.Server {
return httptest.NewServer(mux)
}
type testPersister map[string]string
type testGetterSetter map[string]string
func (p testPersister) Set(key, value string) {
func (p testGetterSetter) Set(key, value string) {
p[key] = value
}
func (p testPersister) Get(key string) string {
func (p testGetterSetter) Get(key string) string {
return p[key]
}

View File

@ -24,39 +24,30 @@ import (
"github.com/ProtonMail/proton-bridge/internal/preferences"
)
type Persister struct {
type pantry struct {
prefs GetterSetter
}
type GetterSetter interface {
Get(string) string
Set(string, string)
}
func NewPersister(prefs GetterSetter) *Persister {
return &Persister{prefs: prefs}
}
func (p *Persister) Persist(url string, cookies []*http.Cookie) error {
func (p *pantry) persistCookies(url string, cookies []*http.Cookie) error {
b, err := json.Marshal(cookies)
if err != nil {
return err
}
val, err := p.load()
val, err := p.loadFromJSON()
if err != nil {
return err
}
val[url] = string(b)
return p.save(val)
return p.saveToJSON(val)
}
func (p *Persister) Load() (map[string][]*http.Cookie, error) {
func (p *pantry) loadCookies() (map[string][]*http.Cookie, error) {
res := make(map[string][]*http.Cookie)
val, err := p.load()
val, err := p.loadFromJSON()
if err != nil {
return nil, err
}
@ -76,15 +67,11 @@ func (p *Persister) Load() (map[string][]*http.Cookie, error) {
type dataStructure map[string]string
func (p *Persister) load() (dataStructure, error) {
func (p *pantry) loadFromJSON() (dataStructure, error) {
b := p.prefs.Get(preferences.CookiesKey)
if b == "" {
if err := p.save(make(dataStructure)); err != nil {
return nil, err
}
return p.load()
return make(dataStructure), nil
}
var val dataStructure
@ -96,7 +83,7 @@ func (p *Persister) load() (dataStructure, error) {
return val, nil
}
func (p *Persister) save(val dataStructure) error {
func (p *pantry) saveToJSON(val dataStructure) error {
b, err := json.Marshal(val)
if err != nil {
return err