diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Scripting/HttpRequest')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs | 183 |
1 files changed, 100 insertions, 83 deletions
diff --git a/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs index eb9b322..821c60e 100644 --- a/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs +++ b/OpenSim/Region/Environment/Modules/Scripting/HttpRequest/ScriptsHttpRequests.cs | |||
@@ -35,8 +35,8 @@ using OpenMetaverse; | |||
35 | using Nini.Config; | 35 | using Nini.Config; |
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Framework.Servers; | 37 | using OpenSim.Framework.Servers; |
38 | using OpenSim.Region.Environment.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Environment.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
40 | using System.Collections; | 40 | using System.Collections; |
41 | 41 | ||
42 | /***************************************************** | 42 | /***************************************************** |
@@ -84,14 +84,14 @@ using System.Collections; | |||
84 | 84 | ||
85 | namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | 85 | namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest |
86 | { | 86 | { |
87 | public class HttpRequestModule : IRegionModule, IHttpRequests | 87 | public class HttpRequestModule : IRegionModule, IHttpRequestModule |
88 | { | 88 | { |
89 | private object HttpListLock = new object(); | 89 | private object HttpListLock = new object(); |
90 | private int httpTimeout = 30000; | 90 | private int httpTimeout = 30000; |
91 | private string m_name = "HttpScriptRequests"; | 91 | private string m_name = "HttpScriptRequests"; |
92 | 92 | ||
93 | private string m_proxyurl = ""; | 93 | private string m_proxyurl = ""; |
94 | private string m_proxyexcepts = ""; | 94 | private string m_proxyexcepts = ""; |
95 | 95 | ||
96 | // <request id, HttpRequestClass> | 96 | // <request id, HttpRequestClass> |
97 | private Dictionary<UUID, HttpRequestClass> m_pendingRequests; | 97 | private Dictionary<UUID, HttpRequestClass> m_pendingRequests; |
@@ -102,7 +102,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
102 | { | 102 | { |
103 | } | 103 | } |
104 | 104 | ||
105 | #region IHttpRequests Members | 105 | #region IHttpRequestModule Members |
106 | 106 | ||
107 | public UUID MakeHttpRequest(string url, string parameters, string body) | 107 | public UUID MakeHttpRequest(string url, string parameters, string body) |
108 | { | 108 | { |
@@ -125,22 +125,22 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
125 | { | 125 | { |
126 | switch (Int32.Parse(parms[i])) | 126 | switch (Int32.Parse(parms[i])) |
127 | { | 127 | { |
128 | case HttpRequestClass.HTTP_METHOD: | 128 | case (int)HttpRequestConstants.HTTP_METHOD: |
129 | 129 | ||
130 | htc.httpMethod = parms[i + 1]; | 130 | htc.HttpMethod = parms[i + 1]; |
131 | break; | 131 | break; |
132 | 132 | ||
133 | case HttpRequestClass.HTTP_MIMETYPE: | 133 | case (int)HttpRequestConstants.HTTP_MIMETYPE: |
134 | 134 | ||
135 | htc.httpMIMEType = parms[i + 1]; | 135 | htc.HttpMIMEType = parms[i + 1]; |
136 | break; | 136 | break; |
137 | 137 | ||
138 | case HttpRequestClass.HTTP_BODY_MAXLENGTH: | 138 | case (int)HttpRequestConstants.HTTP_BODY_MAXLENGTH: |
139 | 139 | ||
140 | // TODO implement me | 140 | // TODO implement me |
141 | break; | 141 | break; |
142 | 142 | ||
143 | case HttpRequestClass.HTTP_VERIFY_CERT: | 143 | case (int)HttpRequestConstants.HTTP_VERIFY_CERT: |
144 | 144 | ||
145 | // TODO implement me | 145 | // TODO implement me |
146 | break; | 146 | break; |
@@ -148,22 +148,22 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
148 | } | 148 | } |
149 | } | 149 | } |
150 | 150 | ||
151 | htc.localID = localID; | 151 | htc.LocalID = localID; |
152 | htc.itemID = itemID; | 152 | htc.ItemID = itemID; |
153 | htc.url = url; | 153 | htc.Url = url; |
154 | htc.reqID = reqID; | 154 | htc.ReqID = reqID; |
155 | htc.httpTimeout = httpTimeout; | 155 | htc.HttpTimeout = httpTimeout; |
156 | htc.outbound_body = body; | 156 | htc.OutboundBody = body; |
157 | htc.response_headers = headers; | 157 | htc.ResponseHeaders = headers; |
158 | htc.proxyurl = m_proxyurl; | 158 | htc.proxyurl = m_proxyurl; |
159 | htc.proxyexcepts = m_proxyexcepts; | 159 | htc.proxyexcepts = m_proxyexcepts; |
160 | 160 | ||
161 | lock (HttpListLock) | 161 | lock (HttpListLock) |
162 | { | 162 | { |
163 | m_pendingRequests.Add(reqID, htc); | 163 | m_pendingRequests.Add(reqID, htc); |
164 | } | 164 | } |
165 | 165 | ||
166 | htc.process(); | 166 | htc.Process(); |
167 | 167 | ||
168 | return reqID; | 168 | return reqID; |
169 | } | 169 | } |
@@ -193,7 +193,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
193 | * it will need some refactoring and this works 'enough' right now | 193 | * it will need some refactoring and this works 'enough' right now |
194 | */ | 194 | */ |
195 | 195 | ||
196 | public HttpRequestClass GetNextCompletedRequest() | 196 | public IServiceRequest GetNextCompletedRequest() |
197 | { | 197 | { |
198 | lock (HttpListLock) | 198 | lock (HttpListLock) |
199 | { | 199 | { |
@@ -203,7 +203,7 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
203 | 203 | ||
204 | if (m_pendingRequests.TryGetValue(luid, out tmpReq)) | 204 | if (m_pendingRequests.TryGetValue(luid, out tmpReq)) |
205 | { | 205 | { |
206 | if (tmpReq.finished) | 206 | if (tmpReq.Finished) |
207 | { | 207 | { |
208 | return tmpReq; | 208 | return tmpReq; |
209 | } | 209 | } |
@@ -235,10 +235,10 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
235 | { | 235 | { |
236 | m_scene = scene; | 236 | m_scene = scene; |
237 | 237 | ||
238 | m_scene.RegisterModuleInterface<IHttpRequests>(this); | 238 | m_scene.RegisterModuleInterface<IHttpRequestModule>(this); |
239 | 239 | ||
240 | m_proxyurl = config.Configs["Startup"].GetString("HttpProxy"); | 240 | m_proxyurl = config.Configs["Startup"].GetString("HttpProxy"); |
241 | m_proxyexcepts = config.Configs["Startup"].GetString("HttpProxyExceptions"); | 241 | m_proxyexcepts = config.Configs["Startup"].GetString("HttpProxyExceptions"); |
242 | 242 | ||
243 | m_pendingRequests = new Dictionary<UUID, HttpRequestClass>(); | 243 | m_pendingRequests = new Dictionary<UUID, HttpRequestClass>(); |
244 | } | 244 | } |
@@ -264,45 +264,64 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
264 | #endregion | 264 | #endregion |
265 | } | 265 | } |
266 | 266 | ||
267 | public class HttpRequestClass | 267 | public class HttpRequestClass: IServiceRequest |
268 | { | 268 | { |
269 | // Constants for parameters | 269 | // Constants for parameters |
270 | public const int HTTP_BODY_MAXLENGTH = 2; | 270 | // public const int HTTP_BODY_MAXLENGTH = 2; |
271 | public const int HTTP_METHOD = 0; | 271 | // public const int HTTP_METHOD = 0; |
272 | public const int HTTP_MIMETYPE = 1; | 272 | // public const int HTTP_MIMETYPE = 1; |
273 | public const int HTTP_VERIFY_CERT = 3; | 273 | // public const int HTTP_VERIFY_CERT = 3; |
274 | public bool finished; | 274 | private bool _finished; |
275 | public int httpBodyMaxLen = 2048; // not implemented | 275 | public bool Finished |
276 | { | ||
277 | get { return _finished; } | ||
278 | } | ||
279 | // public int HttpBodyMaxLen = 2048; // not implemented | ||
276 | 280 | ||
277 | // Parameter members and default values | 281 | // Parameter members and default values |
278 | public string httpMethod = "GET"; | 282 | public string HttpMethod = "GET"; |
279 | public string httpMIMEType = "text/plain;charset=utf-8"; | 283 | public string HttpMIMEType = "text/plain;charset=utf-8"; |
284 | public int HttpTimeout; | ||
285 | // public bool HttpVerifyCert = true; // not implemented | ||
280 | private Thread httpThread; | 286 | private Thread httpThread; |
281 | public int httpTimeout; | ||
282 | public bool httpVerifyCert = true; // not implemented | ||
283 | 287 | ||
284 | // Request info | 288 | // Request info |
285 | public UUID itemID; | 289 | private UUID _itemID; |
286 | public uint localID; | 290 | public UUID ItemID |
287 | public DateTime next; | 291 | { |
288 | public string outbound_body; | 292 | get { return _itemID; } |
289 | public UUID reqID; | 293 | set { _itemID = value; } |
290 | public HttpWebRequest request; | 294 | } |
291 | public string response_body; | 295 | private uint _localID; |
292 | public List<string> response_metadata; | 296 | public uint LocalID |
293 | public Dictionary<string, string> response_headers; | 297 | { |
294 | public int status; | 298 | get { return _localID; } |
295 | public string url; | 299 | set { _localID = value; } |
300 | } | ||
301 | public DateTime Next; | ||
296 | public string proxyurl; | 302 | public string proxyurl; |
297 | public string proxyexcepts; | 303 | public string proxyexcepts; |
298 | 304 | public string OutboundBody; | |
299 | public void process() | 305 | private UUID _reqID; |
306 | public UUID ReqID | ||
307 | { | ||
308 | get { return _reqID; } | ||
309 | set { _reqID = value; } | ||
310 | } | ||
311 | public HttpWebRequest Request; | ||
312 | public string ResponseBody; | ||
313 | public List<string> ResponseMetadata; | ||
314 | public Dictionary<string, string> ResponseHeaders; | ||
315 | public int Status; | ||
316 | public string Url; | ||
317 | |||
318 | public void Process() | ||
300 | { | 319 | { |
301 | httpThread = new Thread(SendRequest); | 320 | httpThread = new Thread(SendRequest); |
302 | httpThread.Name = "HttpRequestThread"; | 321 | httpThread.Name = "HttpRequestThread"; |
303 | httpThread.Priority = ThreadPriority.BelowNormal; | 322 | httpThread.Priority = ThreadPriority.BelowNormal; |
304 | httpThread.IsBackground = true; | 323 | httpThread.IsBackground = true; |
305 | finished = false; | 324 | _finished = false; |
306 | httpThread.Start(); | 325 | httpThread.Start(); |
307 | ThreadTracker.Add(httpThread); | 326 | ThreadTracker.Add(httpThread); |
308 | } | 327 | } |
@@ -322,37 +341,35 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
322 | 341 | ||
323 | try | 342 | try |
324 | { | 343 | { |
325 | request = (HttpWebRequest) | 344 | Request = (HttpWebRequest) WebRequest.Create(Url); |
326 | WebRequest.Create(url); | 345 | Request.Method = HttpMethod; |
327 | request.Method = httpMethod; | 346 | Request.ContentType = HttpMIMEType; |
328 | request.ContentType = httpMIMEType; | 347 | if (proxyurl.Length > 0) |
329 | if (proxyurl.Length > 0) | 348 | { |
330 | { | 349 | if (proxyexcepts.Length > 0) { |
331 | if (proxyexcepts.Length > 0) { | 350 | string[] elist = proxyexcepts.Split(';'); |
332 | string[] elist = proxyexcepts.Split(';'); | 351 | Request.Proxy = new WebProxy(proxyurl,true,elist); |
333 | request.Proxy = new WebProxy(proxyurl,true,elist); | 352 | } else { |
334 | } else { | 353 | Request.Proxy = new WebProxy(proxyurl,true); |
335 | request.Proxy = new WebProxy(proxyurl,true); | 354 | } |
336 | } | 355 | } |
337 | } | 356 | |
338 | 357 | foreach (KeyValuePair<string, string> entry in ResponseHeaders) | |
339 | foreach (KeyValuePair<string, string> entry in response_headers) | 358 | Request.Headers[entry.Key] = entry.Value; |
340 | request.Headers[entry.Key] = entry.Value; | ||
341 | 359 | ||
342 | // Encode outbound data | 360 | // Encode outbound data |
343 | if (outbound_body.Length > 0) { | 361 | if (OutboundBody.Length > 0) { |
344 | byte[] data = Encoding.UTF8.GetBytes(outbound_body); | 362 | byte[] data = Encoding.UTF8.GetBytes(OutboundBody); |
345 | 363 | ||
346 | request.ContentLength = data.Length; | 364 | Request.ContentLength = data.Length; |
347 | Stream bstream = request.GetRequestStream(); | 365 | Stream bstream = Request.GetRequestStream(); |
348 | bstream.Write(data, 0, data.Length); | 366 | bstream.Write(data, 0, data.Length); |
349 | bstream.Close(); | 367 | bstream.Close(); |
350 | } | 368 | } |
351 | 369 | ||
352 | request.Timeout = httpTimeout; | 370 | Request.Timeout = HttpTimeout; |
353 | // execute the request | 371 | // execute the request |
354 | response = (HttpWebResponse) | 372 | response = (HttpWebResponse) Request.GetResponse(); |
355 | request.GetResponse(); | ||
356 | 373 | ||
357 | Stream resStream = response.GetResponseStream(); | 374 | Stream resStream = response.GetResponseStream(); |
358 | 375 | ||
@@ -372,23 +389,23 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
372 | } | 389 | } |
373 | } while (count > 0); // any more data to read? | 390 | } while (count > 0); // any more data to read? |
374 | 391 | ||
375 | response_body = sb.ToString(); | 392 | ResponseBody = sb.ToString(); |
376 | } | 393 | } |
377 | catch (Exception e) | 394 | catch (Exception e) |
378 | { | 395 | { |
379 | if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError) | 396 | if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError) |
380 | { | 397 | { |
381 | HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response; | 398 | HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response; |
382 | status = (int)webRsp.StatusCode; | 399 | Status = (int)webRsp.StatusCode; |
383 | response_body = webRsp.StatusDescription; | 400 | ResponseBody = webRsp.StatusDescription; |
384 | } | 401 | } |
385 | else | 402 | else |
386 | { | 403 | { |
387 | status = (int)OSHttpStatusCode.ClientErrorJoker; | 404 | Status = (int)OSHttpStatusCode.ClientErrorJoker; |
388 | response_body = e.Message; | 405 | ResponseBody = e.Message; |
389 | } | 406 | } |
390 | 407 | ||
391 | finished = true; | 408 | _finished = true; |
392 | return; | 409 | return; |
393 | } | 410 | } |
394 | finally | 411 | finally |
@@ -397,8 +414,8 @@ namespace OpenSim.Region.Environment.Modules.Scripting.HttpRequest | |||
397 | response.Close(); | 414 | response.Close(); |
398 | } | 415 | } |
399 | 416 | ||
400 | status = (int)OSHttpStatusCode.SuccessOk; | 417 | Status = (int)OSHttpStatusCode.SuccessOk; |
401 | finished = true; | 418 | _finished = true; |
402 | } | 419 | } |
403 | 420 | ||
404 | public void Stop() | 421 | public void Stop() |