diff --git a/indra/llmessage/aicurlthread.cpp b/indra/llmessage/aicurlthread.cpp index 4a9c9198c..6ede742b8 100644 --- a/indra/llmessage/aicurlthread.cpp +++ b/indra/llmessage/aicurlthread.cpp @@ -2196,6 +2196,7 @@ size_t BufferedCurlEasyRequest::curlHeaderCallback(char* data, size_t size, size return header_len; } std::string header(header_line, header_len); + bool being_redirected = false; bool done = false; if (!LLStringUtil::_isASCII(header)) { @@ -2240,7 +2241,7 @@ size_t BufferedCurlEasyRequest::curlHeaderCallback(char* data, size_t size, size if (status >= 300 && status < 400) { // Timeout administration needs to know if we're being redirected. - self_w->httptimeout()->being_redirected(); + being_redirected = true; } } // Update HTTP bandwidth. @@ -2254,6 +2255,14 @@ size_t BufferedCurlEasyRequest::curlHeaderCallback(char* data, size_t size, size // Transfer timed out. Return 0 which will abort with error CURLE_WRITE_ERROR. return 0; } + if (being_redirected) + { + // Call this after data_received(), because that might reset mBeingRedirected if it causes a late- upload_finished! + // Ie, when the upload finished was not detected and this is a redirect header then the call to data_received() + // will call upload_finished() which sets HTTPTimeout::mUploadFinished (and resets HTTPTimeout::mBeingRedirected), + // after which we set HTTPTimeout::mBeingRedirected here because we ARE being redirected. + self_w->httptimeout()->being_redirected(); + } if (done) { return header_len;