public static void Main(string[] args) { string jsonString = "{\"Rumor\" : {" + "\"MessageID\": \"" + Guid.NewGuid().ToString() + ":4\"," + "\"Originator\": \"Phil\" ," + "\"Text\": \"Hello World!\"" + "}," + "\"EndPoint\": \"https://example.com/gossip/13244\"}"; //Write.WriteLine(jsonString); RumorMessage rm = JsonConvert.DeserializeObject <RumorMessage>(jsonString); //Write.WriteLine(rm.ToJson()); jsonString = "{\"Want\": { " + "\"" + Guid.NewGuid().ToString() + "\": 3," + "\"" + Guid.NewGuid().ToString() + "\": 5," + "\"" + Guid.NewGuid().ToString() + "\": 10" + "}," + "\"EndPoint\": \"https://example.com/gossip/asff3\"}"; //Write.WriteLine(jsonString); WantMessage wm = JsonConvert.DeserializeObject <WantMessage>(jsonString); //Write.WriteLine(wm.ToJson()); //Write.WriteLine("\n\n"); //Write.WriteLine(JsonConvert.SerializeObject(wm)); //GossipLoop.TestRequest("http://localhost:2000/login", wm); }
private static void SendWant(Peer Neighbor, User Me) { WantMessage want = Me.MessageState.GetWant(); want.EndPoint = Me.Endpoint; Sender.SendMessage(Neighbor.Endpoint, want); }
public WantMessage GetWant() { WantMessage want = new WantMessage(); List <MessageId> receivedIDs = ( from rm in ReceivedMessages select rm.Rumor.FullId).ToList(); List <string> distinctOrigins = ( from rid in receivedIDs select rid.origin).Distinct().ToList(); foreach (string orig in distinctOrigins) { List <MessageId> groupedMessages = ( from rm in ReceivedMessages where rm.Rumor.FullId.origin == orig orderby rm.Rumor.FullId.sequence descending select rm.Rumor.FullId).ToList(); want.AddWant(groupedMessages[0]); } return(want); }
public GossipModule() { Post["/chat/{id}"] = _ => { User user = UserManager.get().getShortUser(_.id); if (user == null) { //HeadResponse response = new HeadResponse(Response.Context.Response); //response.StatusCode = HttpStatusCode.BadRequest; //response.ReasonPhrase = _.id + " is not a valid user at this endpoint."; return(HttpStatusCode.BadRequest); } RequestStream requestStream = Request.Body; int requestLength = (int)requestStream.Length; byte[] requestBytes = new byte[requestLength]; requestStream.Read(requestBytes, 0, requestLength); string requestBody = System.Text.Encoding.Default.GetString(requestBytes); WantMessage want = JsonConvert.DeserializeObject <WantMessage>(requestBody); RumorMessage rumor = JsonConvert.DeserializeObject <RumorMessage>(requestBody); if (VerifyRumor(rumor) && !user.MessageState.ReceivedMessages.Contains(rumor)) { if (!user.Neighbors.Contains(new Peer { Endpoint = rumor.EndPoint })) { user.AddPeer(rumor.EndPoint); } user.MessageState.AddMessage(rumor); } else if (VerifyWant(want)) { if (!user.Neighbors.Contains(new Peer { Endpoint = rumor.EndPoint })) { user.AddPeer(rumor.EndPoint); } List <RumorMessage> missingMessages = user.MessageState.GetMissingRumors(want.WantList); foreach (RumorMessage mm in missingMessages) { mm.EndPoint = user.Endpoint; bool success = Sender.SendMessage(want.EndPoint, mm); if (success) { user.MessageState.AddSentTo(want.EndPoint, mm); } } } else { //HeadResponse response = new HeadResponse(Response.Context.Response); //response.StatusCode = HttpStatusCode.BadRequest; //response.ReasonPhrase = "The following is not a valid request body:\n" + requestBody; return(HttpStatusCode.BadRequest); } // this is the endpoint that external nodes will use // it must implement the following algorithm: /* * t = getMessage(); * if ( isRumor(t) ) { * store(t) * } elsif ( isWant(t) ) { * work_queue = addWorkToQueue(t) * foreach w work_queue { * s = prepareMsg(state, w) * <url> = getUrl(w) * send(<url>, s) * state = update(state, s) * } * } */ return(HttpStatusCode.OK); }; Get["/timer/{milliseconds}"] = _ => { int repeatMilliSeconds = (int)_.milliseconds; GossipLoop.ChangeLoopTime(repeatMilliSeconds); return(null); }; }
private bool VerifyWant(WantMessage want) { return(want != null && want.EndPoint != null && want.WantList != null); }