Esempio n. 1
0
        public MainModule()
        {
            Get("/health", _ =>
            {
                return(Response.AsJson(new
                {
                    Uptime = (long)(DateTime.Now - Start).TotalMilliseconds,
                    Peers = Peers.Count
                }));
            });

            Post("/announce", _ =>
            {
                var request = Request.Body;

                if (request == null)
                {
                    return(CreateError("No request received"));
                }

                if (request.Length > 4096)
                {
                    return(CreateError("Announcement too large"));
                }

                try
                {
                    using (var ms = new MemoryStream())
                    {
                        request.CopyTo(ms);
                        var request_val  = Encoding.UTF8.GetString(ms.ToArray());
                        var announcement = JsonConvert.DeserializeObject <Announcement>(request_val);
                        var join_block   = new JoinBlock(announcement.Address, announcement.Port);

                        if (!join_block.Verify(announcement.ID))
                        {
                            throw new Exception();
                        }

                        var id = join_block.GenerateID();

                        bool known       = Peers.Add(id);
                        LastAnnounce[id] = DateTime.UtcNow;

                        return(Response.AsJson(new
                        {
                            Success = true,
                            Known = known
                        }));
                    }
                }
                catch
                {
                    return(CreateError("Error while announcing"));
                }
            });

            Get("/bootstrap", _ =>
            {
                if (!int.TryParse(Request.Query["count"] ?? "4", out int count))
                {
                    count = 4;
                }

                count = Math.Min(Math.Max(1, count), 16);

                return(Response.AsJson(new
                {
                    Success = true,
                    Peers = Peers.ShuffleIterator(Program.Random).Take(count).Select(id => id.ToUsefulString())
                }));
            });
        }