func (peer *Peer) Handler(m *pat.PatternServeMux) { m.Get("/stats", http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) { stats := httpclient.JsonData{ "ring": peer.ring.GetNodes(), "vnodeCount": peer.node.VnodeCount(), "vnodeSize": peer.node.VnodeSize(), "vnodeStart": peer.node.VnodeStart(), } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) io.WriteString(w, stats.Encode()) })) m.Put("/ring", http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) { body, _ := ioutil.ReadAll(request.Body) data := map[string][]string{} json.Unmarshal(body, &data) peer.ring.SetNodes(data["ring"]) peer.node = peer.ring.Get(peer.url) w.WriteHeader(201) })) m.Put("/peers", http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) { body, _ := ioutil.ReadAll(request.Body) newPeerURL := string(body) if peer.peerExists(newPeerURL) { w.WriteHeader(409) } else { peer.addPeer(newPeerURL) w.WriteHeader(201) } })) m.Put("/peers/join", http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) { body, _ := ioutil.ReadAll(request.Body) newPeerURL := string(body) if peer.peerExists(newPeerURL) { w.WriteHeader(409) } else { peer.join(newPeerURL) w.WriteHeader(201) } })) m.Get("/peers", http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) { if peer.HasPeer() { w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) io.WriteString(w, httpclient.JsonData{"peers": peer.Peers}.Encode()) } else { w.WriteHeader(404) } })) }
func (peer *Peer) join(newPeer string) { for _, p := range peer.Peers { httpclient.Put(p+"/peers", newPeer) httpclient.Put(newPeer+"/peers", p) } peer.addPeer(newPeer) peer.ring.AddNode(newPeer) httpclient.Put(newPeer+"/peers", peer.url) for _, p := range peer.Peers { nodes := httpclient.JsonData{ "ring": peer.ring.GetNodes(), } httpclient.Put(p+"/ring", nodes.Encode()) } }