diff options
-rw-r--r-- | indra/llcommon/llversionserver.h | 2 | ||||
-rw-r--r-- | indra/llmessage/llurlrequest.cpp | 49 | ||||
-rw-r--r-- | indra/llmessage/llurlrequest.h | 13 | ||||
-rw-r--r-- | indra/lscript/lscript_execute.h | 7 | ||||
-rw-r--r-- | indra/lscript/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 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) |