From ea8e83274ae76598ff7a97eb50991e9f4826091b Mon Sep 17 00:00:00 2001
From: Robert Knop <prospero@lindenlab.com>
Date: Fri, 6 Feb 2009 19:14:32 +0000
Subject: [PATCH] svn merge -r 108748:109731
 svn+ssh://svn.lindenlab.com/svn/linden/branches/server/server-1.25

Merge server 1.25 back to trunk

Conflicts:

C    indra/llcommon/llversionserver.h  : svn reverted

C    indra/tools/bill/MoneyMachine.pm : one conflict, only difference
                                        was a blank line.

C    indra/newsim/lllslmanager.cpp : kept merge-right, in consultation
C    indra/newsim/lllslmanager.h   :   with babbage
C    indra/newsim/llagentinfo.cpp  : (runNested, not runSpecial)

C    indra/test/test_entity_query.py        : Kept merge-right
C    indra/test/test_agent_linden_dollar.py : Kept merge-right
                  --> Kartic fixed these testes in server-1.25

C    indra/test/template/httpd.tmpl : Kept merge-right
                                      (the IfModule version)
---
 indra/llcommon/llversionserver.h              |  2 +-
 indra/llmessage/llurlrequest.cpp              | 49 +++++++------------
 indra/llmessage/llurlrequest.h                | 13 ++---
 indra/lscript/lscript_execute.h               |  7 +++
 .../lscript_execute/lscript_execute.cpp       |  5 ++
 5 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 04a9893d668..7593eeae379 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -36,7 +36,7 @@
 const S32 LL_VERSION_MAJOR = 1;
 const S32 LL_VERSION_MINOR = 27;
 const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 108794;
+const S32 LL_VERSION_BUILD = 109809;
 
 const char * const LL_CHANNEL = "Second Life Server";
 
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index d03c8dfd252..6ef97bea586 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -502,33 +502,25 @@ static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user)
 	std::string header(header_line, header_len);
 
 	// Per HTTP spec the first header line must be the status line.
-	if (!complete->haveHTTPStatus())
+	if (header.substr(0,5) == "HTTP/")
 	{
-		if (header.substr(0,5) == "HTTP/")
+		std::string::iterator end = header.end();
+		std::string::iterator pos1 = std::find(header.begin(), end, ' ');
+		if (pos1 != end) ++pos1;
+		std::string::iterator pos2 = std::find(pos1, end, ' ');
+		if (pos2 != end) ++pos2;
+		std::string::iterator pos3 = std::find(pos2, end, '\r');
+
+		std::string version(header.begin(), pos1);
+		std::string status(pos1, pos2);
+		std::string reason(pos2, pos3);
+
+		S32 status_code = atoi(status.c_str());
+		if (status_code > 0)
 		{
-			std::string::iterator end = header.end();
-			std::string::iterator pos1 = std::find(header.begin(), end, ' ');
-			if (pos1 != end) ++pos1;
-			std::string::iterator pos2 = std::find(pos1, end, ' ');
-			if (pos2 != end) ++pos2;
-			std::string::iterator pos3 = std::find(pos2, end, '\r');
-
-			std::string version(header.begin(), pos1);
-			std::string status(pos1, pos2);
-			std::string reason(pos2, pos3);
-
-			int statusCode = atoi(status.c_str());
-			if (statusCode >= 300 && statusCode < 400)
-			{
-				// This is a redirect, ignore it and all headers
-				// until we find a normal status code.
-			}
-			else if (statusCode > 0)
-			{
-				complete->httpStatus((U32)statusCode, reason);
-			}
+			complete->httpStatus((U32)status_code, reason);
+			return header_len;
 		}
-		return header_len;
 	}
 
 	std::string::iterator sep = std::find(header.begin(),header.end(),':');
@@ -593,8 +585,7 @@ LLIOPipe::EStatus LLContextURLExtractor::process_impl(
  * LLURLRequestComplete
  */
 LLURLRequestComplete::LLURLRequestComplete() :
-	mRequestStatus(LLIOPipe::STATUS_ERROR),
-	mHaveHTTPStatus(false)
+	mRequestStatus(LLIOPipe::STATUS_ERROR)
 {
 	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 }
@@ -610,12 +601,6 @@ void LLURLRequestComplete::header(const std::string& header, const std::string&
 {
 }
 
-//virtual 
-void LLURLRequestComplete::httpStatus(U32 status, const std::string& reason)
-{
-	mHaveHTTPStatus = true;
-}
-
 //virtual 
 void LLURLRequestComplete::complete(const LLChannelDescriptors& channels,
 		const buffer_ptr_t& buffer)
diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h
index 2a3b463ad30..d1facbff0f2 100644
--- a/indra/llmessage/llurlrequest.h
+++ b/indra/llmessage/llurlrequest.h
@@ -287,11 +287,13 @@ class LLURLRequestComplete : public LLIOPipe
 {
 public:
 	
+	// Called once for each header received, except status lines
 	virtual void header(const std::string& header, const std::string& value);
-	    ///< Called once for each header received, prior to httpStatus
 
-	virtual void httpStatus(U32 status, const std::string& reason);
-	    ///< Always called on request completion, prior to complete
+	// May be called more than once, particularly for redirects and proxy madness.
+	// Ex. a 200 for a connection to https through a proxy, followed by the "real" status
+	//     a 3xx for a redirect followed by a "real" status, or more redirects.
+	virtual void httpStatus(U32 status, const std::string& reason) { }
 
 	virtual void complete(
 		const LLChannelDescriptors& channels,
@@ -328,9 +330,6 @@ class LLURLRequestComplete : public LLIOPipe
 	LLURLRequestComplete();
 	virtual ~LLURLRequestComplete();
 
-	// The first line of an http response must be the status line
-	// true if we have already parsed this line.
-	bool haveHTTPStatus() const { return mHaveHTTPStatus; }
 protected:
 	/* @name LLIOPipe virtual implementations
 	 */
@@ -349,8 +348,6 @@ class LLURLRequestComplete : public LLIOPipe
 	// value to note if we actually got the response. This value
 	// depends on correct useage from the LLURLRequest instance.
 	EStatus mRequestStatus;
-
-	bool mHaveHTTPStatus;
 };
 
 
diff --git a/indra/lscript/lscript_execute.h b/indra/lscript/lscript_execute.h
index a22c37cfe9e..9a631c4c8f0 100644
--- a/indra/lscript/lscript_execute.h
+++ b/indra/lscript/lscript_execute.h
@@ -434,6 +434,13 @@ class LLScriptExecute
 						  F32 quanta,
 						  U32& events_processed, LLTimer& timer);
 
+	// NOTE: babbage: this must be used on occasions where another script may already be executing. Only 2 levels of nesting are allowed.
+	// Provided to support bizarre detach behaviour only. Do not use.
+	virtual F32 runNested(BOOL b_print, const LLUUID &id,
+						  const char **errorstr, 
+						  F32 quanta,
+						  U32& events_processed, LLTimer& timer);
+
 	// Run smallest possible amount of code: an instruction for LSL2, a segment
 	// between save tests for Mono
 	void runInstructions(BOOL b_print, const LLUUID &id,
diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp
index 5630f2de0b5..daa17f371cd 100644
--- a/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -961,6 +961,11 @@ F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **erro
 	return inloop;
 }
 
+F32 LLScriptExecute::runNested(BOOL b_print, const LLUUID &id, const char **errorstr, F32 quanta, U32& events_processed, LLTimer& timer)
+{
+	return LLScriptExecute::runQuanta(b_print, id, errorstr, quanta, events_processed, timer);
+}
+
 BOOL run_noop(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
 {
 	if (b_print)
-- 
GitLab