aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r--OpenSim/Framework/Communications/Limit/IRequestLimitStrategy.cs68
-rw-r--r--OpenSim/Framework/Communications/Limit/RepeatLimitStrategy.cs113
2 files changed, 181 insertions, 0 deletions
diff --git a/OpenSim/Framework/Communications/Limit/IRequestLimitStrategy.cs b/OpenSim/Framework/Communications/Limit/IRequestLimitStrategy.cs
new file mode 100644
index 0000000..ded9ffc
--- /dev/null
+++ b/OpenSim/Framework/Communications/Limit/IRequestLimitStrategy.cs
@@ -0,0 +1,68 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29
30namespace OpenSim.Framework.Communications.Limit
31{
32 /// <summary>
33 /// Interface for strategies that can limit requests from the client. Currently only used in the
34 /// texture modules to deal with repeated requests for certain textures. However, limiting strategies
35 /// could be used with other requests.
36 /// </summary>
37 public interface IRequestLimitStrategy<TId>
38 {
39 /// <summary>
40 /// Should the request be allowed? If the id is not monitored, then the request is always allowed.
41 /// Otherwise, the strategy criteria will be applied.
42 /// </summary>
43 /// <param name="id"></param>
44 /// <returns></returns>
45 bool AllowRequest(TId id);
46
47 /// <summary>
48 /// Has the request been refused just once?
49 /// </summary>
50 /// <returns>False if the request has not yet been refused, or if the request has been refused more
51 /// than once.</returns>
52 bool IsFirstRefusal(TId id);
53
54 /// <summary>
55 /// Start monitoring for future AllowRequest calls. If the id is already monitored, then monitoring
56 /// continues.
57 /// </summary>
58 /// <param name="id"></param>
59 void MonitorRequests(TId id);
60
61 /// <summary>
62 /// Is the id being monitored?
63 /// </summary>
64 /// <param name="uuid"> </param>
65 /// <returns></returns>
66 bool IsMonitoringRequests(TId id);
67 }
68}
diff --git a/OpenSim/Framework/Communications/Limit/RepeatLimitStrategy.cs b/OpenSim/Framework/Communications/Limit/RepeatLimitStrategy.cs
new file mode 100644
index 0000000..6dd0fa1
--- /dev/null
+++ b/OpenSim/Framework/Communications/Limit/RepeatLimitStrategy.cs
@@ -0,0 +1,113 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30
31namespace OpenSim.Framework.Communications.Limit
32{
33 /// <summary>
34 /// Limit requests by discarding them after they've been repeated a certain number of times.
35 /// </summary>
36 public class RepeatLimitStrategy<TId> : IRequestLimitStrategy<TId>
37 {
38 private static readonly log4net.ILog m_log
39 = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
40
41 /// <summary>
42 /// Record each asset request that we're notified about.
43 /// </summary>
44 private readonly Dictionary<TId, int> requestCounts = new Dictionary<TId, int>();
45
46 /// <summary>
47 /// The maximum number of requests that can be made before we drop subsequent requests.
48 /// </summary>
49 private readonly int m_maxRequests;
50 public int MaxRequests
51 {
52 get { return m_maxRequests; }
53 }
54
55 /// <summary></summary>
56 /// <param name="maxRequests">The maximum number of requests that may be served before all further
57 /// requests are dropped.</param>
58 public RepeatLimitStrategy(int maxRequests)
59 {
60 m_maxRequests = maxRequests;
61 }
62
63 /// <summary>
64 /// <see cref="IRequestLimitStrategy"/>
65 /// </summary>
66 public bool AllowRequest(TId id)
67 {
68 if (requestCounts.ContainsKey(id))
69 {
70 requestCounts[id] += 1;
71
72 if (requestCounts[id] > m_maxRequests)
73 {
74 return false;
75 }
76 }
77
78 return true;
79 }
80
81 /// <summary>
82 /// <see cref="IRequestLimitStrategy"/>
83 /// </summary>
84 public bool IsFirstRefusal(TId id)
85 {
86 if (m_maxRequests + 1 == requestCounts[id])
87 {
88 return true;
89 }
90
91 return false;
92 }
93
94 /// <summary>
95 /// <see cref="IRequestLimitStrategy"/>
96 /// </summary>
97 public void MonitorRequests(TId id)
98 {
99 if (!IsMonitoringRequests(id))
100 {
101 requestCounts.Add(id, 1);
102 }
103 }
104
105 /// <summary>
106 /// <see cref="IRequestLimitStrategy"/>
107 /// </summary>
108 public bool IsMonitoringRequests(TId id)
109 {
110 return requestCounts.ContainsKey(id);
111 }
112 }
113}