Beispiel #1
0
        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);
        }
Beispiel #2
0
        private static void SendWant(Peer Neighbor, User Me)
        {
            WantMessage want = Me.MessageState.GetWant();

            want.EndPoint = Me.Endpoint;
            Sender.SendMessage(Neighbor.Endpoint, want);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            };
        }
Beispiel #5
0
 private bool VerifyWant(WantMessage want)
 {
     return(want != null &&
            want.EndPoint != null &&
            want.WantList != null);
 }