diff options
| author | Monty Brandenberg <monty@lindenlab.com> | 2013-09-11 19:21:31 -0400 | 
|---|---|---|
| committer | Monty Brandenberg <monty@lindenlab.com> | 2013-09-11 19:21:31 -0400 | 
| commit | 622eae65551df9a4ca6843a6a657777ff5e2140e (patch) | |
| tree | 28e740af2ca9371b49762042cac3634357c3dfa6 | |
| parent | 2e8e40cf7974a4ab6ca13d264104dbb8b80419b7 (diff) | |
SH-4490 More 'humane' error code presentation from llcorehttp callers
Added toTerseString() conversion on HttpStatus to generate a string
that's more descriptive than the hex value of the HttpStatus value
but still forms a short, searchable token (e.g. "Http_503" or
"Core_7").  Using this throughout the viewer now, no live cases
of toHex(), I believe.
| -rwxr-xr-x | indra/llcorehttp/_httplibcurl.cpp | 4 | ||||
| -rwxr-xr-x | indra/llcorehttp/_httppolicy.cpp | 4 | ||||
| -rwxr-xr-x | indra/llcorehttp/httpcommon.cpp | 42 | ||||
| -rwxr-xr-x | indra/llcorehttp/httpcommon.h | 8 | ||||
| -rwxr-xr-x | indra/llcorehttp/tests/test_httpstatus.hpp | 61 | ||||
| -rwxr-xr-x | indra/newview/llmeshrepository.cpp | 32 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.cpp | 12 | 
7 files changed, 135 insertions, 28 deletions
| diff --git a/indra/llcorehttp/_httplibcurl.cpp b/indra/llcorehttp/_httplibcurl.cpp index 0cb4e9d8b7..fc257fb0c1 100755 --- a/indra/llcorehttp/_httplibcurl.cpp +++ b/indra/llcorehttp/_httplibcurl.cpp @@ -249,7 +249,7 @@ void HttpLibcurl::cancelRequest(HttpOpRequest * op)  	{  		LL_INFOS("CoreHttp") << "TRACE, RequestCanceled, Handle:  "  							 << static_cast<HttpHandle>(op) -							 << ", Status:  " << op->mStatus.toHex() +							 << ", Status:  " << op->mStatus.toTerseString()  							 << LL_ENDL;  	} @@ -326,7 +326,7 @@ bool HttpLibcurl::completeRequest(CURLM * multi_handle, CURL * handle, CURLcode  	{  		LL_INFOS("CoreHttp") << "TRACE, RequestComplete, Handle:  "  							 << static_cast<HttpHandle>(op) -							 << ", Status:  " << op->mStatus.toHex() +							 << ", Status:  " << op->mStatus.toTerseString()  							 << LL_ENDL;  	} diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp index ac79a77659..edaf0a5307 100755 --- a/indra/llcorehttp/_httppolicy.cpp +++ b/indra/llcorehttp/_httppolicy.cpp @@ -174,7 +174,7 @@ void HttpPolicy::retryOp(HttpOpRequest * op)  						  << " retry " << op->mPolicyRetries  						  << " scheduled in " << (delta / HttpTime(1000))  						  << " mS (" << (external_delta ? "external" : "internal") -						  << ").  Status:  " << op->mStatus.toHex() +						  << ").  Status:  " << op->mStatus.toTerseString()  						  << LL_ENDL;  	if (op->mTracing > HTTP_TRACE_OFF)  	{ @@ -426,7 +426,7 @@ bool HttpPolicy::stageAfterCompletion(HttpOpRequest * op)  		LL_WARNS("CoreHttp") << "HTTP request " << static_cast<HttpHandle>(op)  							 << " failed after " << op->mPolicyRetries  							 << " retries.  Reason:  " << op->mStatus.toString() -							 << " (" << op->mStatus.toHex() << ")" +							 << " (" << op->mStatus.toTerseString() << ")"  							 << LL_ENDL;  	}  	else if (op->mPolicyRetries) diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp index f2fcbf77a3..ca57a18578 100755 --- a/indra/llcorehttp/httpcommon.cpp +++ b/indra/llcorehttp/httpcommon.cpp @@ -4,7 +4,7 @@   *   * $LicenseInfo:firstyear=2012&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-2013, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -174,6 +174,46 @@ std::string HttpStatus::toString() const  	}  	return std::string("Unknown error");  } + + +std::string HttpStatus::toTerseString() const +{ +	std::ostringstream result; + +	unsigned int error_value((unsigned short) mStatus); +	 +	switch (mType) +	{ +	case EXT_CURL_EASY: +		result << "Easy_"; +		break; +		 +	case EXT_CURL_MULTI: +		result << "Multi_"; +		break; +		 +	case LLCORE: +		result << "Core_"; +		break; + +	default: +		if (isHttpStatus()) +		{ +			result << "Http_"; +			error_value = mType; +		} +		else +		{ +			result << "Unknown_"; +		} +		break; +	} +	 +	result << error_value; +	return result.str(); +} + +  } // end namespace LLCore diff --git a/indra/llcorehttp/httpcommon.h b/indra/llcorehttp/httpcommon.h index 9db884057f..a04b344a9e 100755 --- a/indra/llcorehttp/httpcommon.h +++ b/indra/llcorehttp/httpcommon.h @@ -380,6 +380,14 @@ struct HttpStatus  	/// LLCore itself).  	std::string toString() const; +	/// Convert status to a compact string representation +	/// of the form:  "<type>_<value>".  The <type> will be +	/// one of:  Core, Http, Easy, Multi, Unknown.  And +	/// <value> will be an unsigned integer.  More easily +	/// interpreted than the hex representation, it's still +	/// compact and easily searched. +	std::string toTerseString() const; +  	/// Returns true if the status value represents an  	/// HTTP response status (100 - 999).  	bool isHttpStatus() const diff --git a/indra/llcorehttp/tests/test_httpstatus.hpp b/indra/llcorehttp/tests/test_httpstatus.hpp index 887315befc..ae8f665f8e 100755 --- a/indra/llcorehttp/tests/test_httpstatus.hpp +++ b/indra/llcorehttp/tests/test_httpstatus.hpp @@ -4,7 +4,7 @@   *   * $LicenseInfo:firstyear=2012&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-2013, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -277,6 +277,65 @@ void HttpStatusTestObjectType::test<7>()  	ensure(msg == "Unknown error");  } + +template <> template <> +void HttpStatusTestObjectType::test<8>() +{ +	set_test_name("HttpStatus toHex() nominal function"); +	 +	HttpStatus status(404); +	std::string msg = status.toHex(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure(msg == "01940001"); +} + + +template <> template <> +void HttpStatusTestObjectType::test<9>() +{ +	set_test_name("HttpStatus toTerseString() nominal function"); +	 +	HttpStatus status(404); +	std::string msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Normal HTTP 404", msg == "Http_404"); + +	status = HttpStatus(200); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Normal HTTP 200", msg == "Http_200"); + +	status = HttpStatus(200, HE_REPLY_ERROR); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Unsuccessful HTTP 200", msg == "Http_200");			// No distinction for error + +	status = HttpStatus(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_CONNECT); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Easy couldn't connect error", msg == "Easy_7"); + +	status = HttpStatus(HttpStatus::EXT_CURL_MULTI, CURLM_OUT_OF_MEMORY); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Multi out-of-memory error", msg == "Multi_3"); + +	status = HttpStatus(HttpStatus::LLCORE, HE_OPT_NOT_SET); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Core option not set error", msg == "Core_7"); + +	status = HttpStatus(22000, 1); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Undecodable error", msg == "Unknown_1"); + +	status = HttpStatus(22000, -1); +	msg = status.toTerseString(); +	// std::cout << "Result:  " << msg << std::endl; +	ensure("Undecodable error 65535", msg == "Unknown_65535"); +} +  } // end namespace tut  #endif	// TEST_HTTP_STATUS_H diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 507797a85d..353e7e9a7f 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -688,7 +688,7 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,  	// Log details.  	LL_WARNS(LOG_MESH) << "Error in stage:  " << stage  					   << ", Reason:  " << status.toString() -					   << " (" << status.toHex() << ")" << LL_ENDL; +					   << " (" << status.toTerseString() << ")" << LL_ENDL;  	if (content.has("error"))  	{  		const LLSD& err = content["error"]; @@ -1205,7 +1205,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  				{  					LL_WARNS(LOG_MESH) << "HTTP GET request failed for skin info on mesh " << mID  									   << ".  Reason:  " << mHttpStatus.toString() -									   << " (" << mHttpStatus.toHex() << ")" +									   << " (" << mHttpStatus.toTerseString() << ")"  									   << LL_ENDL;  					delete handler;  					ret = false; @@ -1298,7 +1298,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  				{  					LL_WARNS(LOG_MESH) << "HTTP GET request failed for decomposition mesh " << mID  									   << ".  Reason:  " << mHttpStatus.toString() -									   << " (" << mHttpStatus.toHex() << ")" +									   << " (" << mHttpStatus.toTerseString() << ")"  									   << LL_ENDL;  					delete handler;  					ret = false; @@ -1389,7 +1389,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  				{  					LL_WARNS(LOG_MESH) << "HTTP GET request failed for physics shape on mesh " << mID  									   << ".  Reason:  " << mHttpStatus.toString() -									   << " (" << mHttpStatus.toHex() << ")" +									   << " (" << mHttpStatus.toTerseString() << ")"  									   << LL_ENDL;  					delete handler;  					ret = false; @@ -1486,7 +1486,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)  		{  			LL_WARNS(LOG_MESH) << "HTTP GET request failed for mesh header " << mID  							   << ".  Reason:  " << mHttpStatus.toString() -							   << " (" << mHttpStatus.toHex() << ")" +							   << " (" << mHttpStatus.toTerseString() << ")"  							   << LL_ENDL;  			delete handler;  			retval = false; @@ -1568,7 +1568,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  				{  					LL_WARNS(LOG_MESH) << "HTTP GET request failed for LOD on mesh " << mID  									   << ".  Reason:  " << mHttpStatus.toString() -									   << " (" << mHttpStatus.toHex() << ")" +									   << " (" << mHttpStatus.toTerseString() << ")"  									   << LL_ENDL;  					delete handler;  					retval = false; @@ -2196,7 +2196,7 @@ void LLMeshUploadThread::doWholeModelUpload()  			mHttpStatus = mHttpRequest->getStatus();  			LL_WARNS(LOG_MESH) << "Couldn't issue request for full model upload.  Reason:  " << mHttpStatus.toString() -							   << " (" << mHttpStatus.toHex() << ")" +							   << " (" << mHttpStatus.toTerseString() << ")"  							   << LL_ENDL;  		}  		else @@ -2244,7 +2244,7 @@ void LLMeshUploadThread::requestWholeModelFee()  		mHttpStatus = mHttpRequest->getStatus();  		LL_WARNS(LOG_MESH) << "Couldn't issue request for model fee.  Reason:  " << mHttpStatus.toString() -						   << " (" << mHttpStatus.toHex() << ")" +						   << " (" << mHttpStatus.toTerseString() << ")"  						   << LL_ENDL;  	}  	else @@ -2285,7 +2285,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp  		if (! status)  		{  			LL_WARNS(LOG_MESH) << "Upload failed.  Reason:  " << reason -							   << " (" << status.toHex() << ")" +							   << " (" << status.toTerseString() << ")"  							   << LL_ENDL;  			// Build a fake body for the alert generator @@ -2349,7 +2349,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp  		if (! status)  		{  			LL_WARNS(LOG_MESH) << "Fee request failed.  Reason:  " << reason -							   << " (" << status.toHex() << ")" +							   << " (" << status.toTerseString() << ")"  							   << LL_ENDL;  			// Build a fake body for the alert generator @@ -2584,7 +2584,7 @@ void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespo  		if (par_status != status)  		{  			LL_WARNS_ONCE(LOG_MESH) << "Non-206 successful status received for fetch:  " -									<< status.toHex() << LL_ENDL; +									<< status.toTerseString() << LL_ENDL;  		}  		LLCore::BufferArray * body(response->getBody()); @@ -2633,7 +2633,7 @@ void LLMeshHeaderHandler::processFailure(LLCore::HttpStatus status)  {  	LL_WARNS(LOG_MESH) << "Error during mesh header handling.  ID:  " << mMeshParams.getSculptID()  					   << ", Reason:  " << status.toString() -					   << " (" << status.toHex() << ").  Not retrying." +					   << " (" << status.toTerseString() << ").  Not retrying."  					   << LL_ENDL;  	// Can't get the header so none of the LODs will be available @@ -2739,7 +2739,7 @@ void LLMeshLODHandler::processFailure(LLCore::HttpStatus status)  {  	LL_WARNS(LOG_MESH) << "Error during mesh LOD handling.  ID:  " << mMeshParams.getSculptID()  					   << ", Reason:  " << status.toString() -					   << " (" << status.toHex() << ").  Not retrying." +					   << " (" << status.toTerseString() << ").  Not retrying."  					   << LL_ENDL;  	LLMutexLock lock(gMeshRepo.mThread->mMutex); @@ -2783,7 +2783,7 @@ void LLMeshSkinInfoHandler::processFailure(LLCore::HttpStatus status)  {  	LL_WARNS(LOG_MESH) << "Error during mesh skin info handling.  ID:  " << mMeshID  					   << ", Reason:  " << status.toString() -					   << " (" << status.toHex() << ").  Not retrying." +					   << " (" << status.toTerseString() << ").  Not retrying."  					   << LL_ENDL;  	// *TODO:  Mark mesh unavailable on error.  For now, simply leave @@ -2826,7 +2826,7 @@ void LLMeshDecompositionHandler::processFailure(LLCore::HttpStatus status)  {  	LL_WARNS(LOG_MESH) << "Error during mesh decomposition handling.  ID:  " << mMeshID  					   << ", Reason:  " << status.toString() -					   << " (" << status.toHex() << ").  Not retrying." +					   << " (" << status.toTerseString() << ").  Not retrying."  					   << LL_ENDL;  	// *TODO:  Mark mesh unavailable on error.  For now, simply leave  	// request unfulfilled rather than retry forever. @@ -2868,7 +2868,7 @@ void LLMeshPhysicsShapeHandler::processFailure(LLCore::HttpStatus status)  {  	LL_WARNS(LOG_MESH) << "Error during mesh physics shape handling.  ID:  " << mMeshID  					   << ", Reason:  " << status.toString() -					   << " (" << status.toHex() << ").  Not retrying." +					   << " (" << status.toTerseString() << ").  Not retrying."  					   << LL_ENDL;  	// *TODO:  Mark mesh unavailable on error  } diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 141198bc16..bcb55c4bbe 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1552,7 +1552,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				else  				{  					llinfos << "HTTP GET failed for: " << mUrl -							<< " Status: " << mGetStatus.toHex() +							<< " Status: " << mGetStatus.toTerseString()  							<< " Reason: '" << mGetReason << "'"  							<< llendl;  				} @@ -1896,7 +1896,7 @@ void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRe  	LLCore::HttpStatus status(response->getStatus());  	LL_DEBUGS("Texture") << "HTTP COMPLETE: " << mID -			 << " status: " << status.toHex() +			 << " status: " << status.toTerseString()  			 << " '" << status.toString() << "'"  			 << llendl;  //	unsigned int offset(0), length(0), full_length(0); @@ -1912,7 +1912,7 @@ void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRe  		success = false;  		std::string reason(status.toString());  		setGetStatus(status, reason); -		llwarns << "CURL GET FAILED, status: " << status.toHex() +		llwarns << "CURL GET FAILED, status: " << status.toTerseString()  				<< " reason: " << reason << llendl;  	}  	else @@ -3781,7 +3781,7 @@ public:  		else  		{  			LL_WARNS("Texture") << "Error delivering asset metrics to grid.  Status:  " -								<< status.toHex() +								<< status.toTerseString()  								<< ", Reason:  " << status.toString() << LL_ENDL;  		}  	} @@ -4470,7 +4470,7 @@ S32 LLTextureFetchDebugger::fillCurlQueue()  			LL_WARNS("Texture") << "Couldn't issue HTTP request in debugger for texture "  								<< mFetchingHistory[i].mID -								<< ", status: " << status.toHex() +								<< ", status: " << status.toTerseString()  								<< " reason:  " << status.toString()  								<< LL_ENDL;  			mFetchingHistory[i].mCurlState = FetchEntry::CURL_DONE; @@ -4863,7 +4863,7 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon  	else //failed  	{  		llinfos << "Fetch Debugger : CURL GET FAILED,  ID = " << fetch.mID -				<< ", status: " << status.toHex() +				<< ", status: " << status.toTerseString()  				<< " reason:  " << status.toString() << llendl;  	}  } | 
