summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/llversionserver.h2
-rw-r--r--indra/llmessage/llurlrequest.cpp49
-rw-r--r--indra/llmessage/llurlrequest.h13
-rw-r--r--indra/lscript/lscript_execute.h7
-rw-r--r--indra/lscript/lscript_execute/lscript_execute.cpp5
5 files changed, 35 insertions, 41 deletions
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 04a9893d66..7593eeae37 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 d03c8dfd25..6ef97bea58 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);
}
@@ -611,12 +602,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 2a3b463ad3..d1facbff0f 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 @@ public:
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 @@ protected:
// 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 a22c37cfe9..9a631c4c8f 100644
--- a/indra/lscript/lscript_execute.h
+++ b/indra/lscript/lscript_execute.h
@@ -434,6 +434,13 @@ public:
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 5630f2de0b..daa17f371c 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)