From 909b4836ad2d5c4730dff54b1f0dfa951fa6252e Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Fri, 26 Jul 2013 10:59:48 -0300 Subject: [PATCH] anidb: Allow setting the Logger to use for logging traffic By default, log to ioutil.Discard (logging to nil would result in a crash). The udpWrap now needs to keep a reference to *AniDB in order to use the Logger. UpdateTitles also had to be changed to be an *AniDB* method because of the Logger. --- anidb.go | 9 +++++++-- animecache.go | 11 +++++------ auth.go | 6 +++--- filecache.go | 3 +-- titlecache.go | 15 ++++++++------- udp.go | 22 ++++++++++++---------- 6 files changed, 36 insertions(+), 30 deletions(-) diff --git a/anidb.go b/anidb.go index bb0d658..7029a46 100644 --- a/anidb.go +++ b/anidb.go @@ -2,6 +2,8 @@ package anidb import ( + "io/ioutil" + "log" "time" ) @@ -19,16 +21,19 @@ import ( // by a previous Auth() call. type AniDB struct { Timeout time.Duration // Timeout for the various calls (default: 45s) + Logger *log.Logger // Logger where HTTP/UDP traffic is logged udp *udpWrap } // Initialises a new AniDB. func NewAniDB() *AniDB { - return &AniDB{ + ret := &AniDB{ Timeout: 45 * time.Second, - udp: newUDPWrap(), + Logger: log.New(ioutil.Discard, "", log.LstdFlags), } + ret.udp = newUDPWrap(ret) + return ret } func (adb *AniDB) User() *User { diff --git a/animecache.go b/animecache.go index 4ec6e0e..eff4df6 100644 --- a/animecache.go +++ b/animecache.go @@ -6,7 +6,6 @@ import ( "github.com/Kovensky/go-anidb/misc" "github.com/Kovensky/go-anidb/udp" "github.com/Kovensky/go-fscache" - "log" "sort" "strconv" "strings" @@ -84,7 +83,7 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime { go func() { httpChan := make(chan httpAnimeResponse, 1) go func() { - log.Printf("HTTP>>> Anime %d", aid) + adb.Logger.Printf("HTTP>>> Anime %d", aid) a, err := httpapi.GetAnime(int(aid)) httpChan <- httpAnimeResponse{anime: a, err: err} }() @@ -109,22 +108,22 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime { case <-timeout: // HTTP API timeout if httpChan != nil { - log.Printf("HTTP<<< Timeout") + adb.Logger.Printf("HTTP<<< Timeout") close(httpChan) } case resp := <-httpChan: if resp.err != nil { - log.Printf("HTTP<<< %v", resp.err) + adb.Logger.Printf("HTTP<<< %v", resp.err) ok = false break Loop } if resp.anime.Error != "" { - log.Printf("HTTP<<< Error %q", resp.anime.Error) + adb.Logger.Printf("HTTP<<< Error %q", resp.anime.Error) } if anime.populateFromHTTP(resp.anime) { - log.Printf("HTTP<<< Anime %q", anime.PrimaryTitle) + adb.Logger.Printf("HTTP<<< Anime %q", anime.PrimaryTitle) } else { // HTTP ok but parsing not ok if anime.PrimaryTitle == "" { diff --git a/auth.go b/auth.go index 069a095..c63d49b 100644 --- a/auth.go +++ b/auth.go @@ -92,12 +92,12 @@ func (udp *udpWrap) ReAuth() udpapi.APIReply { defer udp.credLock.Unlock() if c := udp.credentials; c != nil { - logRequest(paramSet{cmd: "AUTH", params: paramMap{"user": decrypt(c.username)}}) + udp.logRequest(paramSet{cmd: "AUTH", params: paramMap{"user": decrypt(c.username)}}) r := udp.AniDBUDP.Auth( decrypt(c.username), decrypt(c.password), decrypt(c.udpKey)) - logReply(r) + udp.logReply(r) err := r.Error() @@ -185,7 +185,7 @@ func (adb *AniDB) Logout() error { if adb.udp.connected { adb.udp.connected = false - logRequest(paramSet{cmd: "LOGOUT"}) + adb.udp.logRequest(paramSet{cmd: "LOGOUT"}) return adb.udp.Logout() } return nil diff --git a/filecache.go b/filecache.go index e590a73..cb8d528 100644 --- a/filecache.go +++ b/filecache.go @@ -6,7 +6,6 @@ import ( "github.com/Kovensky/go-anidb/udp" "github.com/Kovensky/go-fscache" "image" - "log" "regexp" "sort" "strconv" @@ -300,7 +299,7 @@ func (adb *AniDB) parseFileResponse(f **File, reply udpapi.APIReply, calledFromF if partial { if calledFromFIDsByGID { epno = test - log.Printf("UDP!!! FID %d is only part of episode %s with no complementary files", fid, epno) + adb.Logger.Printf("UDP!!! FID %d is only part of episode %s with no complementary files", fid, epno) } else if len(test) == 1 && test[0].Start.Number == test[0].End.Number { fids := []int{} diff --git a/titlecache.go b/titlecache.go index a69a5e4..d5356d8 100644 --- a/titlecache.go +++ b/titlecache.go @@ -4,7 +4,6 @@ import ( "bytes" "github.com/Kovensky/go-anidb/titles" "io" - "log" "net/http" "os" "time" @@ -38,7 +37,9 @@ func TitlesUpToDate() (ok bool) { // Downloads a new anime-titles database if the database is outdated. // // Saves the database as anime-titles.dat.gz in the cache dir. -func UpdateTitles() error { +func (adb *AniDB) UpdateTitles() error { + // needs the AniDB for the Logger + // too new, no need to update if TitlesUpToDate() { return nil @@ -55,21 +56,21 @@ func UpdateTitles() error { c := &http.Client{Transport: &http.Transport{DisableCompression: true}} - log.Printf("HTTP>>> %s", titles.DataDumpURL) + adb.Logger.Printf("HTTP>>> %s", titles.DataDumpURL) resp, err := c.Get(titles.DataDumpURL) if err != nil { - log.Printf("HTTP<<< %s", resp.Status) + adb.Logger.Printf("HTTP<<< %s", resp.Status) return err } defer resp.Body.Close() buf := bytes.Buffer{} - log.Printf("HTTP--- %s", resp.Status) + adb.Logger.Printf("HTTP--- %s", resp.Status) _, err = io.Copy(&buf, resp.Body) if err != nil { - log.Printf("HTTP--- %v", err) + adb.Logger.Printf("HTTP--- %v", err) return err } @@ -84,7 +85,7 @@ func UpdateTitles() error { } defer func() { - log.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime) + adb.Logger.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime) }() return RefreshTitles() } diff --git a/udp.go b/udp.go index b43d0f6..e3ca0fa 100644 --- a/udp.go +++ b/udp.go @@ -2,7 +2,6 @@ package anidb import ( "github.com/Kovensky/go-anidb/udp" - "log" "sync" "time" ) @@ -39,6 +38,8 @@ type paramSet struct { type udpWrap struct { *udpapi.AniDBUDP + adb *AniDB + sendLock sync.Mutex sendQueueCh chan paramSet @@ -49,9 +50,10 @@ type udpWrap struct { user *User } -func newUDPWrap() *udpWrap { +func newUDPWrap(adb *AniDB) *udpWrap { u := &udpWrap{ AniDBUDP: udpapi.NewAniDBUDP(), + adb: adb, sendQueueCh: make(chan paramSet, 10), } go u.sendQueue() @@ -92,17 +94,17 @@ func (r *bannedAPIReply) Error() error { var bannedReply udpapi.APIReply = &bannedAPIReply{} -func logRequest(set paramSet) { +func (udp *udpWrap) logRequest(set paramSet) { switch set.cmd { case "AUTH": - log.Printf("UDP>>> AUTH user=%s\n", set.params["user"]) + udp.adb.Logger.Printf("UDP>>> AUTH user=%s\n", set.params["user"]) default: - log.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String()) + udp.adb.Logger.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String()) } } -func logReply(reply udpapi.APIReply) { - log.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text()) +func (udp *udpWrap) logReply(reply udpapi.APIReply) { + udp.adb.Logger.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text()) } func (udp *udpWrap) sendQueue() { @@ -116,7 +118,7 @@ func (udp *udpWrap) sendQueue() { continue } - logRequest(set) + udp.logRequest(set) reply := <-udp.AniDBUDP.SendRecv(set.cmd, udpapi.ParamMap(set.params)) if reply.Error() == udpapi.TimeoutError { @@ -125,7 +127,7 @@ func (udp *udpWrap) sendQueue() { if wait > time.Minute { wait = time.Minute } - log.Printf("UDP--- Timeout; waiting %s before retry", wait) + udp.adb.Logger.Printf("UDP--- Timeout; waiting %s before retry", wait) delete(set.params, "s") delete(set.params, "tag") @@ -133,7 +135,7 @@ func (udp *udpWrap) sendQueue() { time.Sleep(wait) goto Retry } - logReply(reply) + udp.logReply(reply) wait = initialWait -- 2.44.0