diff options
-rw-r--r-- | cache.go | 92 | ||||
-rw-r--r-- | http.go | 3 | ||||
-rw-r--r-- | init.go | 8 | ||||
-rw-r--r-- | post.go | 15 |
4 files changed, 61 insertions, 57 deletions
diff --git a/cache.go b/cache.go index 6220b26..fedc29d 100644 --- a/cache.go +++ b/cache.go @@ -2,7 +2,7 @@ package main import ( "log" - "reflect" + "net" "strings" "time" @@ -123,66 +123,60 @@ func pullDatabase() { iter := db.NewIterator(nil, nil) - // Read the database key-by-key + // Read the database entry-by-entry for iter.Next() { - key := iter.Key() - val := iter.Value() + key := string(iter.Key()) + val := string(iter.Value()) - split := strings.Split(string(key), "*") + split := strings.Split(key, "*") urls := string(split[0]) field := string(split[1]) - // Start with an empty Data struct. If - // there's already one in the cache, pull - // it and use it instead. - data := registry.NewUserData() - twtxtCache.Mu.RLock() - if _, ok := twtxtCache.Reg[urls]; ok { - data = twtxtCache.Reg[urls] - } - twtxtCache.Mu.RUnlock() - ref := reflect.ValueOf(data).Elem() - - // Use reflection to find the right field - // in the Data struct. Once found, assign - // the value and break so the DB iteration - // can continue. - if field != "Status" && urls != "remote" { - for i := 0; i < ref.NumField(); i++ { - - f := ref.Field(i) - if strings.Contains(f.String(), field) { - f.Set(reflect.ValueOf(val)) - break - } + if urls != "remote" { + // Start with an empty Data struct. If + // there's already one in the cache, pull + // it and use it instead. + data := registry.NewUserData() + twtxtCache.Mu.RLock() + if _, ok := twtxtCache.Reg[urls]; ok { + data = twtxtCache.Reg[urls] } - } else if field == "Status" && urls != "remote" { - - // If we're looking at a Status entry in the DB, - // parse the time then add it to the TimeMap under - // data.Status - thetime, err := time.Parse(time.RFC3339, split[2]) - if err != nil { - log.Printf("%v\n", err) + twtxtCache.Mu.RUnlock() + + switch field { + case "IP": + data.IP = net.ParseIP(val) + case "Nick": + data.Nick = val + case "URL": + data.URL = val + case "Date": + data.Date = val + case "Status": + // If we're looking at a Status entry in the DB, + // parse the time then add it to the TimeMap under + // data.Status + thetime, err := time.Parse(time.RFC3339, split[2]) + if err != nil { + log.Printf("%v\n", err) + } + data.Status[thetime] = val } - data.Status[thetime] = string(val) + + // Push the data struct (back) into + // the cache. + twtxtCache.Mu.Lock() + twtxtCache.Reg[urls] = data + twtxtCache.Mu.Unlock() } else { - // The third and final possibility is - // if we've come across an entry for - // a remote twtxt registry to scrape. - // If so, add it to our list. + // If we've come across an entry for + // a remote twtxt registry to scrape, + // add it to our list. remoteRegistries.Mu.Lock() - remoteRegistries.List = append(remoteRegistries.List, string(val)) + remoteRegistries.List = append(remoteRegistries.List, val) remoteRegistries.Mu.Unlock() - continue } - - // Push the data struct (back) into - // the cache. - twtxtCache.Mu.Lock() - twtxtCache.Reg[urls] = data - twtxtCache.Mu.Unlock() } iter.Release() diff --git a/http.go b/http.go index 1f6126c..9b5dd81 100644 --- a/http.go +++ b/http.go @@ -45,10 +45,9 @@ func log200(r *http.Request) { } // log output for 400s -func log400(w http.ResponseWriter, r *http.Request, err error) { +func log400(r *http.Request, err error) { uip := getIPFromCtx(r.Context()) log.Printf("*** %v :: 400 :: %v %v :: %v\n", uip, r.Method, r.URL, err) - http.Error(w, err.Error(), http.StatusBadRequest) } // log output for 404s diff --git a/init.go b/init.go index b898ae8..a6b2aa1 100644 --- a/init.go +++ b/init.go @@ -114,9 +114,17 @@ func initConfig() { confObj.port = viper.GetInt("port") confObj.logFile = viper.GetString("logFile") confObj.dbPath = viper.GetString("databasePath") + log.Printf("Using database: %v\n", confObj.dbPath) confObj.stdoutLogging = viper.GetBool("stdoutLogging") + if confObj.stdoutLogging { + log.Printf("Logging to stdout\n") + } else { + log.Printf("Logging to %v\n", confObj.logFile) + } confObj.cacheInterval = dur + log.Printf("Cache refresh interval: %v\n", dur) confObj.dbInterval = dbDur + log.Printf("Database push interval: %v\n", dbDur) confObj.lastCache = thetime confObj.lastPush = thetime confObj.version = getwtxt diff --git a/post.go b/post.go index 95cc6d3..b9c830e 100644 --- a/post.go +++ b/post.go @@ -14,14 +14,15 @@ import ( // registry before adding each user to the local cache. func apiPostUser(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { - log400(w, r, err) + _, _ = w.Write([]byte(fmt.Sprintf("400 Bad Request: %v\n", err))) + log400(r, err) return } nick := r.FormValue("nickname") urls := r.FormValue("url") if nick == "" || urls == "" { _, _ = w.Write([]byte("400 Bad Request: Nickname or URL Missing\n")) - log400(w, r, fmt.Errorf("nickname or URL missing")) + log400(r, fmt.Errorf("nickname or URL missing")) return } @@ -30,7 +31,7 @@ func apiPostUser(w http.ResponseWriter, r *http.Request) { out, remoteRegistry, err := registry.GetTwtxt(urls) if err != nil { _, _ = w.Write([]byte(fmt.Sprintf("400 Bad Request: %v\n", err))) - log400(w, r, err) + log400(r, err) return } @@ -42,7 +43,7 @@ func apiPostUser(w http.ResponseWriter, r *http.Request) { err := twtxtCache.ScrapeRemoteRegistry(urls) if err != nil { _, _ = w.Write([]byte(fmt.Sprintf("400 Bad Request: %v\n", err))) - log400(w, r, err) + log400(r, err) return } log200(r) @@ -52,15 +53,17 @@ func apiPostUser(w http.ResponseWriter, r *http.Request) { statuses, err := registry.ParseUserTwtxt(out, nick, urls) if err != nil { _, _ = w.Write([]byte(fmt.Sprintf("400 Bad Request: %v\n", err))) - log400(w, r, err) + log400(r, err) return } err = twtxtCache.AddUser(nick, urls, uip, statuses) if err != nil { - log400(w, r, err) + _, _ = w.Write([]byte(fmt.Sprintf("400 Bad Request: %v\n", err))) + log400(r, err) return } log200(r) + _, _ = w.Write([]byte(fmt.Sprintf("200 OK\n"))) } |