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(); } }
public string AddRelay(IRelay relay) { string code; do { code = DownloadCode.Generate(); } while (!activeRelays.TryAdd(code, relay)); return(code); }
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; } }
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); }); }
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)); }
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; }
public void DecodeInvalid() { Assert.AreEqual(false, DownloadCode.TryDecode("abcde", out int x)); }
public void DecodeBlank() { Assert.AreEqual(false, DownloadCode.TryDecode("", out int x)); }
public void DecodeNull() { Assert.AreEqual(false, DownloadCode.TryDecode(null, out int x)); }