diff options
| -rw-r--r-- | indra/llmessage/llcurl.cpp | 15 | ||||
| -rw-r--r-- | indra/llmessage/llcurl.h | 6 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.cpp | 23 | 
3 files changed, 23 insertions, 21 deletions
| diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 36874a5d48..a093e45860 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -364,13 +364,6 @@ U32 LLCurl::Easy::report(CURLcode code)  		responseCode = 499;  		responseReason = strerror(code) + " : " + mErrorBuffer;  	} -		 -	if(responseCode >= 300 && responseCode < 400) //redirect -	{ -		char new_url[512] ; -		curl_easy_getinfo(mCurlEasyHandle, CURLINFO_REDIRECT_URL, new_url); -		responseReason = new_url ; //get the new URL. -	}  	if (mResponder)  	{	 @@ -469,6 +462,13 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	setopt(CURLOPT_HEADERFUNCTION, (void*)&curlHeaderCallback);  	setopt(CURLOPT_HEADERDATA, (void*)this); +	// Allow up to five redirects +	if(responder && responder->followRedir()) +	{ +		setopt(CURLOPT_FOLLOWLOCATION, 1); +		setopt(CURLOPT_MAXREDIRS, MAX_REDIRECTS); +	} +  	setErrorBuffer();  	setCA(); @@ -1061,3 +1061,4 @@ void LLCurl::cleanupClass()  	curl_global_cleanup();  } +const unsigned int LLCurl::MAX_REDIRECTS = 5;
\ No newline at end of file diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index b6a637ae5b..20ca87c87b 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -123,6 +123,11 @@ public:  			// Used internally to set the url for debugging later.  			void setURL(const std::string& url); +			virtual bool followRedir()  +			{ +				return false; +			} +  	public: /* but not really -- don't touch this */  		U32 mReferenceCount; @@ -182,6 +187,7 @@ public:  private:  	static std::string sCAPath;  	static std::string sCAFile; +	static const unsigned int MAX_REDIRECTS;  };  namespace boost diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index ceed90e210..dddfed097d 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -290,8 +290,8 @@ class HTTPGetResponder : public LLCurl::Responder  {  	LOG_CLASS(HTTPGetResponder);  public: -	HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset) -		: mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset) +	HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset, bool redir) +		: mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset), mFollowRedir(redir)  	{  	}  	~HTTPGetResponder() @@ -344,6 +344,11 @@ public:   			llwarns << "Worker not found: " << mID << llendl;  		}  	} + +	virtual bool followRedir() +	{ +		return mFollowRedir; +	}  private:  	LLTextureFetch* mFetcher; @@ -351,6 +356,7 @@ private:  	U64 mStartTime;  	S32 mRequestedSize;  	U32 mOffset; +	bool mFollowRedir;  };  ////////////////////////////////////////////////////////////////////////////// @@ -897,7 +903,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				std::vector<std::string> headers;  				headers.push_back("Accept: image/x-j2c");  				res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize, -															  new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset)); +															  new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true));  			}  			if (!res)  			{ @@ -945,17 +951,6 @@ bool LLTextureFetchWorker::doWork(S32 param)  					max_attempts = mHTTPFailCount+1; // Keep retrying  					LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;  				} -				else if(mGetStatus >= HTTP_MULTIPLE_CHOICES && mGetStatus < HTTP_BAD_REQUEST) //http re-direct -				{ -					++mHTTPFailCount; -					max_attempts = 5 ; //try at most 5 times to avoid infinite redirection loop. - -					llwarns << "HTTP GET failed because of redirection: "  << mUrl -							<< " Status: " << mGetStatus << " Reason: '" << mGetReason << llendl ; - -					//assign to the new url -					mUrl = mGetReason ; -				}  				else  				{  					const S32 HTTP_MAX_RETRY_COUNT = 3; | 
