aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorUbitUmarov2015-12-25 13:51:05 +0000
committerUbitUmarov2015-12-25 13:51:05 +0000
commit41078f8d51b6a1c390007a78825e5500a1efdfa4 (patch)
tree773ffc33f3562cd77cc6e1f2b9281a10acfc1912
parentMerge branch 'master' of opensimulator.org:/var/git/opensim (diff)
downloadopensim-SC_OLD-41078f8d51b6a1c390007a78825e5500a1efdfa4.zip
opensim-SC_OLD-41078f8d51b6a1c390007a78825e5500a1efdfa4.tar.gz
opensim-SC_OLD-41078f8d51b6a1c390007a78825e5500a1efdfa4.tar.bz2
opensim-SC_OLD-41078f8d51b6a1c390007a78825e5500a1efdfa4.tar.xz
try to implement HTTP_BODY_MAXLENGTH. Make it limit body input bytes. Read entire relevant input buffer before UTF-8 parsing, or it may fail.
-rw-r--r--OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs49
1 files changed, 33 insertions, 16 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
index 87f4798..401d65f 100644
--- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
@@ -190,7 +190,15 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
190 190
191 case (int)HttpRequestConstants.HTTP_BODY_MAXLENGTH: 191 case (int)HttpRequestConstants.HTTP_BODY_MAXLENGTH:
192 192
193 // TODO implement me 193 int len;
194 if(int.TryParse(parms[i + 1], out len))
195 {
196 if(len > HttpRequestClass.HttpBodyMaxLenMAX)
197 len = HttpRequestClass.HttpBodyMaxLenMAX;
198 else if(len < 64) //???
199 len = 64;
200 htc.HttpBodyMaxLen = len;
201 }
194 break; 202 break;
195 203
196 case (int)HttpRequestConstants.HTTP_VERIFY_CERT: 204 case (int)HttpRequestConstants.HTTP_VERIFY_CERT:
@@ -445,9 +453,11 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
445 { 453 {
446 get { return _finished; } 454 get { return _finished; }
447 } 455 }
448 // public int HttpBodyMaxLen = 2048; // not implemented 456
457 public const int HttpBodyMaxLenMAX = 16384;
449 458
450 // Parameter members and default values 459 // Parameter members and default values
460 public int HttpBodyMaxLen = 2048;
451 public string HttpMethod = "GET"; 461 public string HttpMethod = "GET";
452 public string HttpMIMEType = "text/plain;charset=utf-8"; 462 public string HttpMIMEType = "text/plain;charset=utf-8";
453 public int HttpTimeout; 463 public int HttpTimeout;
@@ -523,7 +533,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
523 HttpWebResponse response = null; 533 HttpWebResponse response = null;
524 Stream resStream = null; 534 Stream resStream = null;
525 StringBuilder sb = new StringBuilder(); 535 StringBuilder sb = new StringBuilder();
526 byte[] buf = new byte[8192]; 536 byte[] buf = new byte[HttpBodyMaxLenMAX + 16];
527 string tempString = null; 537 string tempString = null;
528 int count = 0; 538 int count = 0;
529 539
@@ -608,26 +618,32 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
608 Status = (int)response.StatusCode; 618 Status = (int)response.StatusCode;
609 619
610 resStream = response.GetResponseStream(); 620 resStream = response.GetResponseStream();
621 int totalBodyBytes = 0;
622 int maxBytes = HttpBodyMaxLen;
623 if(maxBytes > buf.Length)
624 maxBytes = buf.Length;
611 625
626 // we need to read all allowed or UFT8 conversion may fail
612 do 627 do
613 { 628 {
614 // fill the buffer with data 629 // fill the buffer with data
615 count = resStream.Read(buf, 0, buf.Length); 630 count = resStream.Read(buf, totalBodyBytes, maxBytes - totalBodyBytes);
616 631 totalBodyBytes += count;
617 // make sure we read some data 632 if (totalBodyBytes >= maxBytes)
618 if (count != 0) 633 break;
619 {
620 // translate from bytes to ASCII text
621 tempString = Util.UTF8.GetString(buf, 0, count);
622 634
623 // continue building the string
624 sb.Append(tempString);
625 if (sb.Length > 2048)
626 break;
627 }
628 } while (count > 0); // any more data to read? 635 } while (count > 0); // any more data to read?
629 636
630 ResponseBody = sb.ToString().Replace("\r", ""); 637 if(totalBodyBytes > 0)
638 {
639 tempString = Util.UTF8.GetString(buf, 0, totalBodyBytes);
640 sb.Append(tempString);
641 sb.Replace("\r", "");
642 ResponseBody = sb.ToString();
643 sb.Clear();
644 }
645 else
646 ResponseBody = "";
631 } 647 }
632 catch (WebException e) 648 catch (WebException e)
633 { 649 {
@@ -670,6 +686,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
670 resStream.Close(); 686 resStream.Close();
671 if (response != null) 687 if (response != null)
672 response.Close(); 688 response.Close();
689
673 690
674 // We need to resubmit 691 // We need to resubmit
675 if ( 692 if (