diff options
Diffstat (limited to 'src/hub/src/spreadspace.org/sfive/s5srvForward.go')
-rw-r--r-- | src/hub/src/spreadspace.org/sfive/s5srvForward.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/hub/src/spreadspace.org/sfive/s5srvForward.go b/src/hub/src/spreadspace.org/sfive/s5srvForward.go new file mode 100644 index 0000000..6ae0f99 --- /dev/null +++ b/src/hub/src/spreadspace.org/sfive/s5srvForward.go @@ -0,0 +1,55 @@ +package sfive + +import ( + "bytes" + "encoding/json" + "net/http" + "time" +) + +func findMaxId(values []dataUpdateDb) int { + maxId := -1 + for i := range values { + if values[i].Id > maxId { + maxId = values[i].Id + } + } + return maxId +} + +func (self StatsSinkServer) handleForwarding(url string, client *http.Client) { + latestId := 0 // TODO retrieve latest known from server +next: + // TODO forwarding + for { + time.Sleep(500) + + updates, err := self.store.GetUpdatesAfter(latestId) + if err != nil { + s5l.Printf("fwd: failed reading updates: %v\n", err) + continue next + } + + for i := range updates { + data, err := json.Marshal(updates[i]) + if err == nil { + s5l.Printf("fwd: encode failed: %v\n", err) + // TODO retry etc. + continue + } + + _, err = client.Post(url, "application/json", bytes.NewBuffer(data)) + if err == nil { + latestId = findMaxId(updates) + } else { + s5l.Printf("fwd: post failed: %v\n", err) + // TODO retry etc. + } + } + } +} + +func (self StatsSinkServer) RunForwarding(forwardBaseUrl string) { + forwardUrl := forwardBaseUrl + "/updates" + self.handleForwarding(forwardUrl, http.DefaultClient) +} |