Exemple #1
0
        private async Task ProcessRequestAsync(HttpContextBase context)
        {
            // block hosts with more than 10 bad requests in the last 10 seconds..
            // (item1 is last request time, item2 is count of previous requests)
            if (blockedHosts.TryGetValue(context.Request.UserHostAddress, out Tuple <DateTime, int> t) && DateTime.UtcNow.Subtract(t.Item1).TotalSeconds < 10 && t.Item2 > 10)
            {
                return;
            }

            if (context.IsWebSocketRequest)
            {
                if (AcceptSocketConnections)
                {
                    context.AcceptWebSocketRequest((Func <WebSocketContext, Task>)HandleWebsocketRequest);
                }

                return;
            }

            // get download code from querystring or subdomain..
            // (http://9fakr.mydomain.com or http://mydomain.com/9fakr or http://somedomain.dom/mysite/9fakr)
            string path            = context.Request.RawUrl.Substring(context.Request.ApplicationPath.Length).ToLower().Trim(new char[] { '/', '\\', ' ' });
            string code            = (string.IsNullOrEmpty(path) && context.Request.Url.Host.Split('.').Length == 3) ? context.Request.Url.Host.Split('.')[0].ToLower() : path;
            bool   validCode       = DownloadCode.Check(code);
            bool   mainpageRequest = (path == "") && !validCode;

            if (mainpageRequest && !(EnableBuiltinWebclient && AcceptSocketConnections))
            {
                return;
            }

            try
            {
                if (validCode)
                {
                    if (activeRelays.TryGetValue(code, out IRelay relay) && !botAgents.IsMatch(context.Request.UserAgent ?? ""))
                    {
                        await relay.HandleDownloadRequest(context);
                    }
                    else
                    {
                        context.Response.StatusCode = 410;
                    }
                }
                else if (!await staticContent.HandleRequest(context, path))
                {
                    context.Response.StatusCode = 404;
                    blockedHosts.AddOrUpdate(context.Request.UserHostAddress, new Tuple <DateTime, int>(DateTime.UtcNow, 1),
                                             (k, v) => new Tuple <DateTime, int>(DateTime.UtcNow, DateTime.UtcNow.Subtract(v.Item1).TotalSeconds < 10 ? v.Item2 + 1 : 1));
                }
            }
            finally
            {
                context.Response.OutputStream.Dispose();
            }
        }
Exemple #2
0
        public string AddRelay(IRelay relay)
        {
            string code;

            do
            {
                code = DownloadCode.Generate();
            } while (!activeRelays.TryAdd(code, relay));
            return(code);
        }
Exemple #3
0
        public void Update(DownloadCode code, object value)
        {
            switch (code)
            {
            case DownloadCode.DownloadInfo:
                var param = (DownloadInfoParam)value;
                _downloadInfo = param;
                IPAddress     = param.SourceIp;
                break;

            case DownloadCode.Name:
                Name = (string)value;
                break;

            case DownloadCode.Quality:
                Quality = (string)value;
                break;

            case DownloadCode.TimePeriodsAll:
                _all = (TimePeriodPacket[])value;
                updateSlider();
                break;

            case DownloadCode.TimePeriodsCompleted:
                _downloaded = (TimePeriodPacket[])value;
                updateSlider();
                break;

            case DownloadCode.Size:
                Size = getByteLengthString((long)value);
                break;

            case DownloadCode.IsLocalDownload:
                IsLocalDownload = (bool)value;
                onRefresh();
                break;

            case DownloadCode.Status:
                updateStatus((DownloadStatus)(int)value);
                break;

            case DownloadCode.Speed:
                updateSpeed((long)value);
                break;

            case DownloadCode.ErrorInfo:
                ErrorInfo = (string)value;
                break;

            case DownloadCode.UpdatedLastestTime:
                updatedLastestTime((DateTime)value);
                break;
            }
        }
Exemple #4
0
        public void EncodeDecode()
        {
            int low  = (int)Math.Pow(DownloadCode.Chars.Count, DownloadCode.Length - 1) + 1;
            int high = (int)Math.Pow(DownloadCode.Chars.Count, DownloadCode.Length);

            Parallel.ForEach(Enumerable.Range(low, high - low), i =>
            {
                var encoded = DownloadCode.Encode(i);
                Assert.AreEqual(DownloadCode.Length, encoded.Length);
                DownloadCode.TryDecode(encoded, out int decoded);
                Assert.AreEqual(i, decoded);
            });
        }
Exemple #5
0
        public static DownloadExpandPart Decode(MemoryStream ms)
        {
            Guid         guid = PacketBase.ReadGuid(ms);
            DownloadCode code = (DownloadCode)PacketBase.ReadInt(ms);
            Object       obj  = null;

            switch (code)
            {
            case DownloadCode.DownloadInfo:
                obj = DownloadInfoParam.Decode(ms);
                break;

            case DownloadCode.Name:
            case DownloadCode.Quality:
            case DownloadCode.ErrorInfo:
                obj = PacketBase.ReadString(ms);
                break;

            case DownloadCode.Size:
            case DownloadCode.Speed:
                obj = PacketBase.ReadLong(ms);
                break;

            case DownloadCode.IsLocalDownload:
                obj = PacketBase.ReadBool(ms);
                break;

            case DownloadCode.TimePeriodsAll:
            case DownloadCode.TimePeriodsCompleted:
                obj = TimePeriodPacket.DecodeArray(ms);
                break;

            case DownloadCode.Status:
                obj = (DownloadStatus)PacketBase.ReadInt(ms);
                break;

            case DownloadCode.UpdatedLastestTime:
                obj = PacketBase.ReadTime(ms);
                break;

            case DownloadCode.GoTop:
                obj = null;
                break;
            }
            return(new DownloadExpandPart(guid, code, obj));
        }
Exemple #6
0
        static byte[] getBytes(Guid guid, DownloadCode code, object obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                PacketBase.WriteBytes(ms, guid);
                PacketBase.WriteBytes(ms, (int)code);
                switch (code)
                {
                case DownloadCode.DownloadInfo:
                    PacketBase.WriteBytes(ms, DownloadInfoParam.Encode((DownloadInfoParam)obj));
                    break;

                case DownloadCode.Name:
                case DownloadCode.Quality:
                case DownloadCode.ErrorInfo:
                    PacketBase.WriteBytes(ms, (string)obj);
                    break;

                case DownloadCode.Size:
                case DownloadCode.Speed:
                    PacketBase.WriteBytes(ms, (long)obj);
                    break;

                case DownloadCode.IsLocalDownload:
                    PacketBase.WriteBytes(ms, (bool)obj);
                    break;

                case DownloadCode.TimePeriodsAll:
                case DownloadCode.TimePeriodsCompleted:
                    PacketBase.WriteBytes(ms, TimePeriodPacket.EncodeArray((TimePeriodPacket[])obj));
                    break;

                case DownloadCode.Status:
                    PacketBase.WriteBytes(ms, (int)(DownloadStatus)obj);
                    break;

                case DownloadCode.UpdatedLastestTime:
                    PacketBase.WriteBytes(ms, (DateTime)obj);
                    break;

                case DownloadCode.GoTop:
                    break;
                }
                return(ms.ToArray());
            }
        }
 public DownloadExpandPart(Guid guid, DownloadCode code, object obj)
 {
     GuidCode = guid;
     Code     = code;
     Value    = obj;
 }
Exemple #8
0
 public void DecodeInvalid()
 {
     Assert.AreEqual(false, DownloadCode.TryDecode("abcde", out int x));
 }
Exemple #9
0
 public void DecodeBlank()
 {
     Assert.AreEqual(false, DownloadCode.TryDecode("", out int x));
 }
Exemple #10
0
 public void DecodeNull()
 {
     Assert.AreEqual(false, DownloadCode.TryDecode(null, out int x));
 }