diff options
Diffstat (limited to 'OpenSim/Region/OptionalModules/DataSnapshot/DataRequestHandler.cs')
-rw-r--r-- | OpenSim/Region/OptionalModules/DataSnapshot/DataRequestHandler.cs | 77 |
1 files changed, 70 insertions, 7 deletions
diff --git a/OpenSim/Region/OptionalModules/DataSnapshot/DataRequestHandler.cs b/OpenSim/Region/OptionalModules/DataSnapshot/DataRequestHandler.cs index 50276ae..817170f 100644 --- a/OpenSim/Region/OptionalModules/DataSnapshot/DataRequestHandler.cs +++ b/OpenSim/Region/OptionalModules/DataSnapshot/DataRequestHandler.cs | |||
@@ -45,6 +45,7 @@ namespace OpenSim.Region.DataSnapshot | |||
45 | // private Scene m_scene = null; | 45 | // private Scene m_scene = null; |
46 | private DataSnapshotManager m_externalData = null; | 46 | private DataSnapshotManager m_externalData = null; |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | private ExpiringCache<string, int> throotleGen = new ExpiringCache<string, int>(); | ||
48 | 49 | ||
49 | public DataRequestHandler(Scene scene, DataSnapshotManager externalData) | 50 | public DataRequestHandler(Scene scene, DataSnapshotManager externalData) |
50 | { | 51 | { |
@@ -52,29 +53,91 @@ namespace OpenSim.Region.DataSnapshot | |||
52 | m_externalData = externalData; | 53 | m_externalData = externalData; |
53 | 54 | ||
54 | //Register HTTP handler | 55 | //Register HTTP handler |
55 | if (MainServer.Instance.AddHTTPHandler("collector", OnGetSnapshot)) | 56 | if (MainServer.UnSecureInstance.AddHTTPHandler("collector", OnGetSnapshot)) |
56 | { | 57 | { |
57 | m_log.Info("[DATASNAPSHOT]: Set up snapshot service"); | 58 | m_log.Info("[DATASNAPSHOT]: Set up snapshot service"); |
58 | } | 59 | } |
59 | // Register validation callback handler | 60 | // Register validation callback handler |
60 | MainServer.Instance.AddHTTPHandler("validate", OnValidate); | 61 | MainServer.UnSecureInstance.AddHTTPHandler("validate", OnValidate); |
61 | 62 | ||
62 | } | 63 | } |
63 | 64 | ||
65 | private string GetClientString(Hashtable request) | ||
66 | { | ||
67 | string clientstring = ""; | ||
68 | if (!request.ContainsKey("headers")) | ||
69 | return clientstring; | ||
70 | |||
71 | Hashtable requestinfo = (Hashtable)request["headers"]; | ||
72 | if (requestinfo.ContainsKey("x-forwarded-for")) | ||
73 | { | ||
74 | object str = requestinfo["x-forwarded-for"]; | ||
75 | if (str != null) | ||
76 | { | ||
77 | if (!string.IsNullOrEmpty(str.ToString())) | ||
78 | { | ||
79 | return str.ToString(); | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | if (!requestinfo.ContainsKey("remote_addr")) | ||
84 | return clientstring; | ||
85 | |||
86 | object remote_addrobj = requestinfo["remote_addr"]; | ||
87 | if (remote_addrobj != null) | ||
88 | { | ||
89 | if (!string.IsNullOrEmpty(remote_addrobj.ToString())) | ||
90 | { | ||
91 | clientstring = remote_addrobj.ToString(); | ||
92 | } | ||
93 | } | ||
94 | |||
95 | return clientstring; | ||
96 | } | ||
97 | |||
64 | public Hashtable OnGetSnapshot(Hashtable keysvals) | 98 | public Hashtable OnGetSnapshot(Hashtable keysvals) |
65 | { | 99 | { |
66 | m_log.Debug("[DATASNAPSHOT] Received collection request"); | ||
67 | Hashtable reply = new Hashtable(); | 100 | Hashtable reply = new Hashtable(); |
68 | int statuscode = 200; | 101 | string reqtag; |
69 | |||
70 | string snapObj = (string)keysvals["region"]; | 102 | string snapObj = (string)keysvals["region"]; |
103 | if(string.IsNullOrWhiteSpace(snapObj)) | ||
104 | reqtag = GetClientString(keysvals); | ||
105 | else | ||
106 | reqtag = snapObj + GetClientString(keysvals); | ||
107 | |||
108 | |||
109 | if(!string.IsNullOrWhiteSpace(reqtag)) | ||
110 | { | ||
111 | if(throotleGen.Contains(reqtag)) | ||
112 | { | ||
113 | reply["str_response_string"] = "Please try your request again later"; | ||
114 | reply["int_response_code"] = 503; | ||
115 | reply["content_type"] = "text/plain"; | ||
116 | m_log.Debug("[DATASNAPSHOT] Collection request spam. reply try later"); | ||
117 | return reply; | ||
118 | } | ||
119 | |||
120 | throotleGen.AddOrUpdate(reqtag, 0, 60); | ||
121 | } | ||
122 | |||
123 | if(string.IsNullOrWhiteSpace(snapObj)) | ||
124 | m_log.DebugFormat("[DATASNAPSHOT] Received collection request for all"); | ||
125 | else | ||
126 | m_log.DebugFormat("[DATASNAPSHOT] Received collection request for {0}", snapObj); | ||
71 | 127 | ||
72 | XmlDocument response = m_externalData.GetSnapshot(snapObj); | 128 | XmlDocument response = m_externalData.GetSnapshot(snapObj); |
129 | if(response == null) | ||
130 | { | ||
131 | reply["str_response_string"] = "Please try your request again later"; | ||
132 | reply["int_response_code"] = 503; | ||
133 | reply["content_type"] = "text/plain"; | ||
134 | m_log.Debug("[DATASNAPSHOT] Collection request spam. reply try later"); | ||
135 | return reply; | ||
136 | } | ||
73 | 137 | ||
74 | reply["str_response_string"] = response.OuterXml; | 138 | reply["str_response_string"] = response.OuterXml; |
75 | reply["int_response_code"] = statuscode; | 139 | reply["int_response_code"] = 200; |
76 | reply["content_type"] = "text/xml"; | 140 | reply["content_type"] = "text/xml"; |
77 | |||
78 | return reply; | 141 | return reply; |
79 | } | 142 | } |
80 | 143 | ||