aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKevin Cozens2013-03-27 11:52:10 -0400
committerJustin Clark-Casey (justincc)2013-03-29 23:35:12 +0000
commit8b1ca7b35e8e5bb65666fb566c0e797aaa999a4e (patch)
tree466198acc081c32b726ffdc70f7bac800b5da86a
parentChange 0.7.5 flavour to post-fixes (diff)
downloadopensim-SC_OLD-8b1ca7b35e8e5bb65666fb566c0e797aaa999a4e.zip
opensim-SC_OLD-8b1ca7b35e8e5bb65666fb566c0e797aaa999a4e.tar.gz
opensim-SC_OLD-8b1ca7b35e8e5bb65666fb566c0e797aaa999a4e.tar.bz2
opensim-SC_OLD-8b1ca7b35e8e5bb65666fb566c0e797aaa999a4e.tar.xz
Added missing functionality (mainly custom headers) to llHTTPRequest.
-rw-r--r--OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs73
-rw-r--r--OpenSim/Region/Framework/Interfaces/IHttpRequests.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs153
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs15
-rw-r--r--prebuild.xml1
5 files changed, 188 insertions, 57 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
index a676971..c2e37c4 100644
--- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
@@ -187,6 +187,45 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
187 case (int)HttpRequestConstants.HTTP_VERIFY_CERT: 187 case (int)HttpRequestConstants.HTTP_VERIFY_CERT:
188 htc.HttpVerifyCert = (int.Parse(parms[i + 1]) != 0); 188 htc.HttpVerifyCert = (int.Parse(parms[i + 1]) != 0);
189 break; 189 break;
190
191 case (int)HttpRequestConstants.HTTP_VERBOSE_THROTTLE:
192
193 // TODO implement me
194 break;
195
196 case (int)HttpRequestConstants.HTTP_CUSTOM_HEADER:
197 //Parameters are in pairs and custom header takes
198 //arguments in pairs so adjust for header marker.
199 ++i;
200
201 //Maximum of 8 headers are allowed based on the
202 //Second Life documentation for llHTTPRequest.
203 for (int count = 1; count <= 8; ++count)
204 {
205 //Not enough parameters remaining for a header?
206 if (parms.Length - i < 2)
207 break;
208
209 //Have we reached the end of the list of headers?
210 //End is marked by a string with a single digit.
211 //We already know we have at least one parameter
212 //so it is safe to do this check at top of loop.
213 if (Char.IsDigit(parms[i][0]))
214 break;
215
216 if (htc.HttpCustomHeaders == null)
217 htc.HttpCustomHeaders = new List<string>();
218
219 htc.HttpCustomHeaders.Add(parms[i]);
220 htc.HttpCustomHeaders.Add(parms[i+1]);
221
222 i += 2;
223 }
224 break;
225
226 case (int)HttpRequestConstants.HTTP_PRAGMA_NO_CACHE:
227 htc.HttpPragmaNoCache = (int.Parse(parms[i + 1]) != 0);
228 break;
190 } 229 }
191 } 230 }
192 } 231 }
@@ -328,9 +367,12 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
328 // public const int HTTP_METHOD = 0; 367 // public const int HTTP_METHOD = 0;
329 // public const int HTTP_MIMETYPE = 1; 368 // public const int HTTP_MIMETYPE = 1;
330 // public const int HTTP_VERIFY_CERT = 3; 369 // public const int HTTP_VERIFY_CERT = 3;
370 // public const int HTTP_VERBOSE_THROTTLE = 4;
371 // public const int HTTP_CUSTOM_HEADER = 5;
372 // public const int HTTP_PRAGMA_NO_CACHE = 6;
331 private bool _finished; 373 private bool _finished;
332 public bool Finished 374 public bool Finished
333 { 375 {
334 get { return _finished; } 376 get { return _finished; }
335 } 377 }
336 // public int HttpBodyMaxLen = 2048; // not implemented 378 // public int HttpBodyMaxLen = 2048; // not implemented
@@ -340,11 +382,14 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
340 public string HttpMIMEType = "text/plain;charset=utf-8"; 382 public string HttpMIMEType = "text/plain;charset=utf-8";
341 public int HttpTimeout; 383 public int HttpTimeout;
342 public bool HttpVerifyCert = true; 384 public bool HttpVerifyCert = true;
385 //public bool HttpVerboseThrottle = true; // not implemented
386 public List<string> HttpCustomHeaders = null;
387 public bool HttpPragmaNoCache = true;
343 private Thread httpThread; 388 private Thread httpThread;
344 389
345 // Request info 390 // Request info
346 private UUID _itemID; 391 private UUID _itemID;
347 public UUID ItemID 392 public UUID ItemID
348 { 393 {
349 get { return _itemID; } 394 get { return _itemID; }
350 set { _itemID = value; } 395 set { _itemID = value; }
@@ -360,7 +405,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
360 public string proxyexcepts; 405 public string proxyexcepts;
361 public string OutboundBody; 406 public string OutboundBody;
362 private UUID _reqID; 407 private UUID _reqID;
363 public UUID ReqID 408 public UUID ReqID
364 { 409 {
365 get { return _reqID; } 410 get { return _reqID; }
366 set { _reqID = value; } 411 set { _reqID = value; }
@@ -401,7 +446,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
401 Request.Method = HttpMethod; 446 Request.Method = HttpMethod;
402 Request.ContentType = HttpMIMEType; 447 Request.ContentType = HttpMIMEType;
403 448
404 if(!HttpVerifyCert) 449 if (!HttpVerifyCert)
405 { 450 {
406 // We could hijack Connection Group Name to identify 451 // We could hijack Connection Group Name to identify
407 // a desired security exception. But at the moment we'll use a dummy header instead. 452 // a desired security exception. But at the moment we'll use a dummy header instead.
@@ -412,14 +457,24 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
412// { 457// {
413// Request.ConnectionGroupName="Verify"; 458// Request.ConnectionGroupName="Verify";
414// } 459// }
415 if (proxyurl != null && proxyurl.Length > 0) 460 if (!HttpPragmaNoCache)
461 {
462 Request.Headers.Add("Pragma", "no-cache");
463 }
464 if (HttpCustomHeaders != null)
416 { 465 {
417 if (proxyexcepts != null && proxyexcepts.Length > 0) 466 for (int i = 0; i < HttpCustomHeaders.Count; i += 2)
467 Request.Headers.Add(HttpCustomHeaders[i],
468 HttpCustomHeaders[i+1]);
469 }
470 if (proxyurl != null && proxyurl.Length > 0)
471 {
472 if (proxyexcepts != null && proxyexcepts.Length > 0)
418 { 473 {
419 string[] elist = proxyexcepts.Split(';'); 474 string[] elist = proxyexcepts.Split(';');
420 Request.Proxy = new WebProxy(proxyurl, true, elist); 475 Request.Proxy = new WebProxy(proxyurl, true, elist);
421 } 476 }
422 else 477 else
423 { 478 {
424 Request.Proxy = new WebProxy(proxyurl, true); 479 Request.Proxy = new WebProxy(proxyurl, true);
425 } 480 }
@@ -432,7 +487,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
432 Request.Headers[entry.Key] = entry.Value; 487 Request.Headers[entry.Key] = entry.Value;
433 488
434 // Encode outbound data 489 // Encode outbound data
435 if (OutboundBody.Length > 0) 490 if (OutboundBody.Length > 0)
436 { 491 {
437 byte[] data = Util.UTF8.GetBytes(OutboundBody); 492 byte[] data = Util.UTF8.GetBytes(OutboundBody);
438 493
diff --git a/OpenSim/Region/Framework/Interfaces/IHttpRequests.cs b/OpenSim/Region/Framework/Interfaces/IHttpRequests.cs
index de0f2a3..eb6c5ac 100644
--- a/OpenSim/Region/Framework/Interfaces/IHttpRequests.cs
+++ b/OpenSim/Region/Framework/Interfaces/IHttpRequests.cs
@@ -36,6 +36,9 @@ namespace OpenSim.Region.Framework.Interfaces
36 HTTP_MIMETYPE = 1, 36 HTTP_MIMETYPE = 1,
37 HTTP_BODY_MAXLENGTH = 2, 37 HTTP_BODY_MAXLENGTH = 2,
38 HTTP_VERIFY_CERT = 3, 38 HTTP_VERIFY_CERT = 3,
39 HTTP_VERBOSE_THROTTLE = 4,
40 HTTP_CUSTOM_HEADER = 5,
41 HTTP_PRAGMA_NO_CACHE = 6
39 } 42 }
40 43
41 public interface IHttpRequestModule 44 public interface IHttpRequestModule
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1ab107a..42413a3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -66,6 +66,7 @@ using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
66using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString; 66using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
67using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3; 67using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
68using System.Reflection; 68using System.Reflection;
69using System.Linq;
69 70
70namespace OpenSim.Region.ScriptEngine.Shared.Api 71namespace OpenSim.Region.ScriptEngine.Shared.Api
71{ 72{
@@ -110,6 +111,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
110 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp. 111 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
111 protected ISoundModule m_SoundModule = null; 112 protected ISoundModule m_SoundModule = null;
112 113
114 //An array of HTTP/1.1 headers that are not allowed to be used
115 //as custom headers by llHTTPRequest.
116 private string[] HttpStandardHeaders =
117 {
118 "Accept", "Accept-Charset", "Accept-Encoding", "Accept-Language",
119 "Accept-Ranges", "Age", "Allow", "Authorization", "Cache-Control",
120 "Connection", "Content-Encoding", "Content-Language",
121 "Content-Length", "Content-Location", "Content-MD5",
122 "Content-Range", "Content-Type", "Date", "ETag", "Expect",
123 "Expires", "From", "Host", "If-Match", "If-Modified-Since",
124 "If-None-Match", "If-Range", "If-Unmodified-Since", "Last-Modified",
125 "Location", "Max-Forwards", "Pragma", "Proxy-Authenticate",
126 "Proxy-Authorization", "Range", "Referer", "Retry-After", "Server",
127 "TE", "Trailer", "Transfer-Encoding", "Upgrade", "User-Agent",
128 "Vary", "Via", "Warning", "WWW-Authenticate"
129 };
130
113 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 131 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
114 { 132 {
115 m_ScriptEngine = ScriptEngine; 133 m_ScriptEngine = ScriptEngine;
@@ -1522,7 +1540,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1522 if (tex.FaceTextures[i] != null) 1540 if (tex.FaceTextures[i] != null)
1523 { 1541 {
1524 tex.FaceTextures[i].Shiny = sval; 1542 tex.FaceTextures[i].Shiny = sval;
1525 tex.FaceTextures[i].Bump = bump;; 1543 tex.FaceTextures[i].Bump = bump;
1526 } 1544 }
1527 tex.DefaultTexture.Shiny = sval; 1545 tex.DefaultTexture.Shiny = sval;
1528 tex.DefaultTexture.Bump = bump; 1546 tex.DefaultTexture.Bump = bump;
@@ -1631,7 +1649,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1631 texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); 1649 texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f);
1632 tex.DefaultTexture.RGBA = texcolor; 1650 tex.DefaultTexture.RGBA = texcolor;
1633 } 1651 }
1634 1652
1635 part.UpdateTextureEntry(tex.GetBytes()); 1653 part.UpdateTextureEntry(tex.GetBytes());
1636 return; 1654 return;
1637 } 1655 }
@@ -1752,7 +1770,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1752 rgb.x = texcolor.R; 1770 rgb.x = texcolor.R;
1753 rgb.y = texcolor.G; 1771 rgb.y = texcolor.G;
1754 rgb.z = texcolor.B; 1772 rgb.z = texcolor.B;
1755 1773
1756 return rgb; 1774 return rgb;
1757 } 1775 }
1758 else 1776 else
@@ -1784,12 +1802,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1784 { 1802 {
1785 UUID textureID = new UUID(); 1803 UUID textureID = new UUID();
1786 1804
1787 textureID = InventoryKey(texture, (int)AssetType.Texture); 1805 textureID = InventoryKey(texture, (int)AssetType.Texture);
1788 if (textureID == UUID.Zero) 1806 if (textureID == UUID.Zero)
1789 { 1807 {
1790 if (!UUID.TryParse(texture, out textureID)) 1808 if (!UUID.TryParse(texture, out textureID))
1791 return; 1809 return;
1792 } 1810 }
1793 1811
1794 Primitive.TextureEntry tex = part.Shape.Textures; 1812 Primitive.TextureEntry tex = part.Shape.Textures;
1795 1813
@@ -1986,7 +2004,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1986 // IF YOU GET REGION CROSSINGS WORKING WITH THIS FUNCTION, REPLACE THE WORKAROUND. 2004 // IF YOU GET REGION CROSSINGS WORKING WITH THIS FUNCTION, REPLACE THE WORKAROUND.
1987 // 2005 //
1988 // This workaround is to prevent silent failure of this function. 2006 // This workaround is to prevent silent failure of this function.
1989 // According to the specification on the SL Wiki, providing a position outside of the 2007 // According to the specification on the SL Wiki, providing a position outside of the
1990 if (pos.x < 0 || pos.x > Constants.RegionSize || pos.y < 0 || pos.y > Constants.RegionSize) 2008 if (pos.x < 0 || pos.x > Constants.RegionSize || pos.y < 0 || pos.y > Constants.RegionSize)
1991 { 2009 {
1992 return 0; 2010 return 0;
@@ -2195,7 +2213,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2195 { 2213 {
2196 return llGetRootRotation(); 2214 return llGetRootRotation();
2197 } 2215 }
2198 2216
2199 m_host.AddScriptLPS(1); 2217 m_host.AddScriptLPS(1);
2200 Quaternion q = m_host.GetWorldRotation(); 2218 Quaternion q = m_host.GetWorldRotation();
2201 return new LSL_Rotation(q.X, q.Y, q.Z, q.W); 2219 return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
@@ -2882,7 +2900,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2882 // we need to convert from a vector describing 2900 // we need to convert from a vector describing
2883 // the angles of rotation in radians into rotation value 2901 // the angles of rotation in radians into rotation value
2884 LSL_Rotation rot = llEuler2Rot(angle); 2902 LSL_Rotation rot = llEuler2Rot(angle);
2885 2903
2886 // Per discussion with Melanie, for non-physical objects llLookAt appears to simply 2904 // Per discussion with Melanie, for non-physical objects llLookAt appears to simply
2887 // set the rotation of the object, copy that behavior 2905 // set the rotation of the object, copy that behavior
2888 PhysicsActor pa = m_host.PhysActor; 2906 PhysicsActor pa = m_host.PhysActor;
@@ -2958,7 +2976,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2958 2976
2959 if (!UUID.TryParse(id, out objectID)) 2977 if (!UUID.TryParse(id, out objectID))
2960 objectID = UUID.Zero; 2978 objectID = UUID.Zero;
2961 2979
2962 if (objectID == UUID.Zero && name == "") 2980 if (objectID == UUID.Zero && name == "")
2963 return; 2981 return;
2964 2982
@@ -3142,19 +3160,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3142 msg.ParentEstateID = 0; //ParentEstateID; 3160 msg.ParentEstateID = 0; //ParentEstateID;
3143 msg.Position = new Vector3(m_host.AbsolutePosition); 3161 msg.Position = new Vector3(m_host.AbsolutePosition);
3144 msg.RegionID = World.RegionInfo.RegionID.Guid;//RegionID.Guid; 3162 msg.RegionID = World.RegionInfo.RegionID.Guid;//RegionID.Guid;
3145 msg.binaryBucket 3163 msg.binaryBucket
3146 = Util.StringToBytes256( 3164 = Util.StringToBytes256(
3147 "{0}/{1}/{2}/{3}", 3165 "{0}/{1}/{2}/{3}",
3148 World.RegionInfo.RegionName, 3166 World.RegionInfo.RegionName,
3149 (int)Math.Floor(m_host.AbsolutePosition.X), 3167 (int)Math.Floor(m_host.AbsolutePosition.X),
3150 (int)Math.Floor(m_host.AbsolutePosition.Y), 3168 (int)Math.Floor(m_host.AbsolutePosition.Y),
3151 (int)Math.Floor(m_host.AbsolutePosition.Z)); 3169 (int)Math.Floor(m_host.AbsolutePosition.Z));
3152 3170
3153 if (m_TransferModule != null) 3171 if (m_TransferModule != null)
3154 { 3172 {
3155 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); 3173 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {});
3156 } 3174 }
3157 3175
3158 ScriptSleep(2000); 3176 ScriptSleep(2000);
3159 } 3177 }
3160 3178
@@ -3279,7 +3297,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3279 public void llRotLookAt(LSL_Rotation target, double strength, double damping) 3297 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
3280 { 3298 {
3281 m_host.AddScriptLPS(1); 3299 m_host.AddScriptLPS(1);
3282 3300
3283 // Per discussion with Melanie, for non-physical objects llLookAt appears to simply 3301 // Per discussion with Melanie, for non-physical objects llLookAt appears to simply
3284 // set the rotation of the object, copy that behavior 3302 // set the rotation of the object, copy that behavior
3285 PhysicsActor pa = m_host.PhysActor; 3303 PhysicsActor pa = m_host.PhysActor;
@@ -4353,7 +4371,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4353 public void llCollisionSound(string impact_sound, double impact_volume) 4371 public void llCollisionSound(string impact_sound, double impact_volume)
4354 { 4372 {
4355 m_host.AddScriptLPS(1); 4373 m_host.AddScriptLPS(1);
4356 4374
4357 // TODO: Parameter check logic required. 4375 // TODO: Parameter check logic required.
4358 m_host.CollisionSound = KeyOrName(impact_sound, AssetType.Sound); 4376 m_host.CollisionSound = KeyOrName(impact_sound, AssetType.Sound);
4359 m_host.CollisionSoundVolume = (float)impact_volume; 4377 m_host.CollisionSoundVolume = (float)impact_volume;
@@ -5043,7 +5061,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5043 // SL spits out an empty string for types other than key & string 5061 // SL spits out an empty string for types other than key & string
5044 // At the time of patching, LSL_Key is currently LSL_String, 5062 // At the time of patching, LSL_Key is currently LSL_String,
5045 // so the OR check may be a little redundant, but it's being done 5063 // so the OR check may be a little redundant, but it's being done
5046 // for completion and should LSL_Key ever be implemented 5064 // for completion and should LSL_Key ever be implemented
5047 // as it's own struct 5065 // as it's own struct
5048 else if (!(src.Data[index] is LSL_String || 5066 else if (!(src.Data[index] is LSL_String ||
5049 src.Data[index] is LSL_Key)) 5067 src.Data[index] is LSL_Key))
@@ -5179,8 +5197,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5179 { 5197 {
5180 m_host.AddScriptLPS(1); 5198 m_host.AddScriptLPS(1);
5181 5199
5182 return string.Join(", ", 5200 return string.Join(", ",
5183 (new List<object>(src.Data)).ConvertAll<string>(o => 5201 (new List<object>(src.Data)).ConvertAll<string>(o =>
5184 { 5202 {
5185 return o.ToString(); 5203 return o.ToString();
5186 }).ToArray()); 5204 }).ToArray());
@@ -6223,7 +6241,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6223 SetParticleSystem(m_host, rules); 6241 SetParticleSystem(m_host, rules);
6224 } 6242 }
6225 6243
6226 private void SetParticleSystem(SceneObjectPart part, LSL_List rules) 6244 private void SetParticleSystem(SceneObjectPart part, LSL_List rules)
6227 { 6245 {
6228 if (rules.Length == 0) 6246 if (rules.Length == 0)
6229 { 6247 {
@@ -6460,7 +6478,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6460 m_host.OwnerID, m_host.Name, destID, 6478 m_host.OwnerID, m_host.Name, destID,
6461 (byte)InstantMessageDialog.TaskInventoryOffered, 6479 (byte)InstantMessageDialog.TaskInventoryOffered,
6462 false, string.Format("'{0}'", category), 6480 false, string.Format("'{0}'", category),
6463// We won't go so far as to add a SLURL, but this is the format used by LL as of 2012-10-06 6481// We won't go so far as to add a SLURL, but this is the format used by LL as of 2012-10-06
6464// false, string.Format("'{0}' ( http://slurl.com/secondlife/{1}/{2}/{3}/{4} )", category, World.Name, (int)pos.X, (int)pos.Y, (int)pos.Z), 6482// false, string.Format("'{0}' ( http://slurl.com/secondlife/{1}/{2}/{3}/{4} )", category, World.Name, (int)pos.X, (int)pos.Y, (int)pos.Z),
6465 folderID, false, pos, 6483 folderID, false, pos,
6466 bucket, false); 6484 bucket, false);
@@ -6575,12 +6593,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6575 public LSL_String llAvatarOnLinkSitTarget(int linknum) 6593 public LSL_String llAvatarOnLinkSitTarget(int linknum)
6576 { 6594 {
6577 m_host.AddScriptLPS(1); 6595 m_host.AddScriptLPS(1);
6578 if(linknum == ScriptBaseClass.LINK_SET || 6596 if(linknum == ScriptBaseClass.LINK_SET ||
6579 linknum == ScriptBaseClass.LINK_ALL_CHILDREN || 6597 linknum == ScriptBaseClass.LINK_ALL_CHILDREN ||
6580 linknum == ScriptBaseClass.LINK_ALL_OTHERS) return UUID.Zero.ToString(); 6598 linknum == ScriptBaseClass.LINK_ALL_OTHERS) return UUID.Zero.ToString();
6581 6599
6582 List<SceneObjectPart> parts = GetLinkParts(linknum); 6600 List<SceneObjectPart> parts = GetLinkParts(linknum);
6583 if (parts.Count == 0) return UUID.Zero.ToString(); 6601 if (parts.Count == 0) return UUID.Zero.ToString();
6584 return parts[0].SitTargetAvatar.ToString(); 6602 return parts[0].SitTargetAvatar.ToString();
6585 } 6603 }
6586 6604
@@ -6952,7 +6970,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6952 hollow = 0.70f; 6970 hollow = 0.70f;
6953 } 6971 }
6954 } 6972 }
6955 // Otherwise, hollow is limited to 95%. 6973 // Otherwise, hollow is limited to 95%.
6956 else 6974 else
6957 { 6975 {
6958 if (hollow > 0.95f) 6976 if (hollow > 0.95f)
@@ -8133,16 +8151,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8133 res.Add(new LSL_Vector(Shape.PathTaperX / 100.0, Shape.PathTaperY / 100.0, 0)); 8151 res.Add(new LSL_Vector(Shape.PathTaperX / 100.0, Shape.PathTaperY / 100.0, 0));
8134 8152
8135 // float revolutions 8153 // float revolutions
8136 res.Add(new LSL_Float(Math.Round(Shape.PathRevolutions * 0.015d, 2, MidpointRounding.AwayFromZero)) + 1.0d); 8154 res.Add(new LSL_Float(Math.Round(Shape.PathRevolutions * 0.015d, 2, MidpointRounding.AwayFromZero)) + 1.0d);
8137 // Slightly inaccurate, because an unsigned byte is being used to represent 8155 // Slightly inaccurate, because an unsigned byte is being used to represent
8138 // the entire range of floating-point values from 1.0 through 4.0 (which is how 8156 // the entire range of floating-point values from 1.0 through 4.0 (which is how
8139 // SL does it). 8157 // SL does it).
8140 // 8158 //
8141 // Using these formulas to store and retrieve PathRevolutions, it is not 8159 // Using these formulas to store and retrieve PathRevolutions, it is not
8142 // possible to use all values between 1.00 and 4.00. For instance, you can't 8160 // possible to use all values between 1.00 and 4.00. For instance, you can't
8143 // represent 1.10. You can represent 1.09 and 1.11, but not 1.10. So, if you 8161 // represent 1.10. You can represent 1.09 and 1.11, but not 1.10. So, if you
8144 // use llSetPrimitiveParams to set revolutions to 1.10 and then retreive them 8162 // use llSetPrimitiveParams to set revolutions to 1.10 and then retreive them
8145 // with llGetPrimitiveParams, you'll retrieve 1.09. You can also see a similar 8163 // with llGetPrimitiveParams, you'll retrieve 1.09. You can also see a similar
8146 // behavior in the viewer as you cannot set 1.10. The viewer jumps to 1.11. 8164 // behavior in the viewer as you cannot set 1.10. The viewer jumps to 1.11.
8147 // In SL, llSetPrimitveParams and llGetPrimitiveParams can set and get a value 8165 // In SL, llSetPrimitveParams and llGetPrimitiveParams can set and get a value
8148 // such as 1.10. So, SL must store and retreive the actual user input rather 8166 // such as 1.10. So, SL must store and retreive the actual user input rather
@@ -10264,9 +10282,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10264 IHttpRequestModule httpScriptMod = 10282 IHttpRequestModule httpScriptMod =
10265 m_ScriptEngine.World.RequestModuleInterface<IHttpRequestModule>(); 10283 m_ScriptEngine.World.RequestModuleInterface<IHttpRequestModule>();
10266 List<string> param = new List<string>(); 10284 List<string> param = new List<string>();
10267 foreach (object o in parameters.Data) 10285 bool ok;
10286 Int32 flag;
10287
10288 for (int i = 0; i < parameters.Data.Length; i += 2)
10268 { 10289 {
10269 param.Add(o.ToString()); 10290 ok = Int32.TryParse(parameters.Data[i].ToString(), out flag);
10291 if (!ok || flag < 0 ||
10292 flag > (int)HttpRequestConstants.HTTP_PRAGMA_NO_CACHE)
10293 {
10294 throw new ScriptException("Parameter " + i.ToString() + " is an invalid flag");
10295 }
10296
10297 param.Add(parameters.Data[i].ToString()); //Add parameter flag
10298
10299 if (flag != (int)HttpRequestConstants.HTTP_CUSTOM_HEADER)
10300 {
10301 param.Add(parameters.Data[i+1].ToString()); //Add parameter value
10302 }
10303 else
10304 {
10305 //Parameters are in pairs and custom header takes
10306 //arguments in pairs so adjust for header marker.
10307 ++i;
10308
10309 //Maximum of 8 headers are allowed based on the
10310 //Second Life documentation for llHTTPRequest.
10311 for (int count = 1; count <= 8; ++count)
10312 {
10313 //Enough parameters remaining for (another) header?
10314 if (parameters.Data.Length - i < 2)
10315 {
10316 //There must be at least one name/value pair for custom header
10317 if (count == 1)
10318 throw new ScriptException("Missing name/value for custom header at parameter " + i.ToString());
10319 break;
10320 }
10321
10322 if (HttpStandardHeaders.Contains(parameters.Data[i].ToString(), StringComparer.OrdinalIgnoreCase))
10323 throw new ScriptException("Name is invalid as a custom header at parameter " + i.ToString());
10324
10325 param.Add(parameters.Data[i].ToString());
10326 param.Add(parameters.Data[i+1].ToString());
10327
10328 //Have we reached the end of the list of headers?
10329 //End is marked by a string with a single digit.
10330 if (i+2 >= parameters.Data.Length ||
10331 Char.IsDigit(parameters.Data[i].ToString()[0]))
10332 {
10333 break;
10334 }
10335
10336 i += 2;
10337 }
10338 }
10270 } 10339 }
10271 10340
10272 Vector3 position = m_host.AbsolutePosition; 10341 Vector3 position = m_host.AbsolutePosition;
@@ -10376,12 +10445,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10376 public LSL_Integer llGetParcelPrimCount(LSL_Vector pos, int category, int sim_wide) 10445 public LSL_Integer llGetParcelPrimCount(LSL_Vector pos, int category, int sim_wide)
10377 { 10446 {
10378 m_host.AddScriptLPS(1); 10447 m_host.AddScriptLPS(1);
10379 10448
10380 ILandObject lo = World.LandChannel.GetLandObject((float)pos.x, (float)pos.y); 10449 ILandObject lo = World.LandChannel.GetLandObject((float)pos.x, (float)pos.y);
10381 10450
10382 if (lo == null) 10451 if (lo == null)
10383 return 0; 10452 return 0;
10384 10453
10385 IPrimCounts pc = lo.PrimCounts; 10454 IPrimCounts pc = lo.PrimCounts;
10386 10455
10387 if (sim_wide != ScriptBaseClass.FALSE) 10456 if (sim_wide != ScriptBaseClass.FALSE)
@@ -10411,7 +10480,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10411 else if (category == ScriptBaseClass.PARCEL_COUNT_TEMP) 10480 else if (category == ScriptBaseClass.PARCEL_COUNT_TEMP)
10412 return 0; // counts not implemented yet 10481 return 0; // counts not implemented yet
10413 } 10482 }
10414 10483
10415 return 0; 10484 return 0;
10416 } 10485 }
10417 10486
@@ -10754,7 +10823,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10754 return ret; 10823 return ret;
10755 } 10824 }
10756 } 10825 }
10757 10826
10758 return new LSL_List(); 10827 return new LSL_List();
10759 } 10828 }
10760 10829
@@ -11381,7 +11450,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11381 else 11450 else
11382 { 11451 {
11383 ScenePresence sp = World.GetScenePresence(result.ConsumerID); 11452 ScenePresence sp = World.GetScenePresence(result.ConsumerID);
11384 /// It it a boy? a girl? 11453 /// It it a boy? a girl?
11385 if (sp != null) 11454 if (sp != null)
11386 itemID = sp.UUID; 11455 itemID = sp.UUID;
11387 } 11456 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 9bf1a64..86ab03a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -355,6 +355,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
355 public const int HTTP_MIMETYPE = 1; 355 public const int HTTP_MIMETYPE = 1;
356 public const int HTTP_BODY_MAXLENGTH = 2; 356 public const int HTTP_BODY_MAXLENGTH = 2;
357 public const int HTTP_VERIFY_CERT = 3; 357 public const int HTTP_VERIFY_CERT = 3;
358 public const int HTTP_VERBOSE_THROTTLE = 4;
359 public const int HTTP_CUSTOM_HEADER = 5;
360 public const int HTTP_PRAGMA_NO_CACHE = 6;
358 361
359 public const int PRIM_MATERIAL = 2; 362 public const int PRIM_MATERIAL = 2;
360 public const int PRIM_PHYSICS = 3; 363 public const int PRIM_PHYSICS = 3;
@@ -635,7 +638,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
635 public const int TOUCH_INVALID_FACE = -1; 638 public const int TOUCH_INVALID_FACE = -1;
636 public static readonly vector TOUCH_INVALID_TEXCOORD = new vector(-1.0, -1.0, 0.0); 639 public static readonly vector TOUCH_INVALID_TEXCOORD = new vector(-1.0, -1.0, 0.0);
637 public static readonly vector TOUCH_INVALID_VECTOR = ZERO_VECTOR; 640 public static readonly vector TOUCH_INVALID_VECTOR = ZERO_VECTOR;
638 641
639 // constants for llGetPrimMediaParams/llSetPrimMediaParams 642 // constants for llGetPrimMediaParams/llSetPrimMediaParams
640 public const int PRIM_MEDIA_ALT_IMAGE_ENABLE = 0; 643 public const int PRIM_MEDIA_ALT_IMAGE_ENABLE = 0;
641 public const int PRIM_MEDIA_CONTROLS = 1; 644 public const int PRIM_MEDIA_CONTROLS = 1;
@@ -652,15 +655,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
652 public const int PRIM_MEDIA_WHITELIST = 12; 655 public const int PRIM_MEDIA_WHITELIST = 12;
653 public const int PRIM_MEDIA_PERMS_INTERACT = 13; 656 public const int PRIM_MEDIA_PERMS_INTERACT = 13;
654 public const int PRIM_MEDIA_PERMS_CONTROL = 14; 657 public const int PRIM_MEDIA_PERMS_CONTROL = 14;
655 658
656 public const int PRIM_MEDIA_CONTROLS_STANDARD = 0; 659 public const int PRIM_MEDIA_CONTROLS_STANDARD = 0;
657 public const int PRIM_MEDIA_CONTROLS_MINI = 1; 660 public const int PRIM_MEDIA_CONTROLS_MINI = 1;
658 661
659 public const int PRIM_MEDIA_PERM_NONE = 0; 662 public const int PRIM_MEDIA_PERM_NONE = 0;
660 public const int PRIM_MEDIA_PERM_OWNER = 1; 663 public const int PRIM_MEDIA_PERM_OWNER = 1;
661 public const int PRIM_MEDIA_PERM_GROUP = 2; 664 public const int PRIM_MEDIA_PERM_GROUP = 2;
662 public const int PRIM_MEDIA_PERM_ANYONE = 4; 665 public const int PRIM_MEDIA_PERM_ANYONE = 4;
663 666
664 // extra constants for llSetPrimMediaParams 667 // extra constants for llSetPrimMediaParams
665 public static readonly LSLInteger LSL_STATUS_OK = new LSLInteger(0); 668 public static readonly LSLInteger LSL_STATUS_OK = new LSLInteger(0);
666 public static readonly LSLInteger LSL_STATUS_MALFORMED_PARAMS = new LSLInteger(1000); 669 public static readonly LSLInteger LSL_STATUS_MALFORMED_PARAMS = new LSLInteger(1000);
@@ -677,7 +680,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
677 public const string TEXTURE_PLYWOOD = "89556747-24cb-43ed-920b-47caed15465f"; 680 public const string TEXTURE_PLYWOOD = "89556747-24cb-43ed-920b-47caed15465f";
678 public const string TEXTURE_TRANSPARENT = "8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"; 681 public const string TEXTURE_TRANSPARENT = "8dcd4a48-2d37-4909-9f78-f7a9eb4ef903";
679 public const string TEXTURE_MEDIA = "8b5fec65-8d8d-9dc5-cda8-8fdf2716e361"; 682 public const string TEXTURE_MEDIA = "8b5fec65-8d8d-9dc5-cda8-8fdf2716e361";
680 683
681 // Constants for osGetRegionStats 684 // Constants for osGetRegionStats
682 public const int STATS_TIME_DILATION = 0; 685 public const int STATS_TIME_DILATION = 0;
683 public const int STATS_SIM_FPS = 1; 686 public const int STATS_SIM_FPS = 1;
@@ -730,7 +733,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
730 public static readonly LSLInteger RC_GET_ROOT_KEY = 2; 733 public static readonly LSLInteger RC_GET_ROOT_KEY = 2;
731 public static readonly LSLInteger RC_GET_LINK_NUM = 4; 734 public static readonly LSLInteger RC_GET_LINK_NUM = 4;
732 735
733 public static readonly LSLInteger RCERR_UNKNOWN = -1; 736 public static readonly LSLInteger RCERR_UNKNOWN = -1;
734 public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2; 737 public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2;
735 public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3; 738 public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3;
736 739
diff --git a/prebuild.xml b/prebuild.xml
index 4c18aa8..7e28dee 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -2327,6 +2327,7 @@
2327 2327
2328 <ReferencePath>../../../../../../bin/</ReferencePath> 2328 <ReferencePath>../../../../../../bin/</ReferencePath>
2329 <Reference name="System"/> 2329 <Reference name="System"/>
2330 <Reference name="System.Core"/>
2330 <Reference name="System.Data"/> 2331 <Reference name="System.Data"/>
2331 <Reference name="System.Web"/> 2332 <Reference name="System.Web"/>
2332 <Reference name="System.Xml"/> 2333 <Reference name="System.Xml"/>