diff options
| author | Rider Linden <rider@lindenlab.com> | 2015-08-14 16:45:26 -0700 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2015-08-14 16:45:26 -0700 | 
| commit | aa3042ea331479128a65d890d44314cc7c630e2c (patch) | |
| tree | ae26d4686fe7a2da9b96c6e7df2c4f7ea5effcbc /indra | |
| parent | 248d61fe0eadd128c7704e37922ba7fdef35d630 (diff) | |
MAINT-5506: Converted llmessage untrusted sim message responder to coroutine.
Removed HTTPSender, HTTPNullSender, HTTPCapSender.
Moved UntrustedMessageCap storage into LLHost
Added boost libraries to PROJECT_x_TEST linkage.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/cmake/LLAddBuildTest.cmake | 3 | ||||
| -rwxr-xr-x | indra/llmessage/CMakeLists.txt | 5 | ||||
| -rwxr-xr-x | indra/llmessage/llhost.h | 4 | ||||
| -rwxr-xr-x | indra/llmessage/llhttpsender.cpp | 94 | ||||
| -rwxr-xr-x | indra/llmessage/llhttpsender.h | 59 | ||||
| -rwxr-xr-x | indra/llmessage/message.cpp | 89 | ||||
| -rwxr-xr-x | indra/llmessage/message.h | 6 | ||||
| -rwxr-xr-x | indra/newview/CMakeLists.txt | 2 | ||||
| -rwxr-xr-x | indra/newview/llcaphttpsender.cpp | 49 | ||||
| -rwxr-xr-x | indra/newview/llcaphttpsender.h | 48 | ||||
| -rwxr-xr-x | indra/newview/llstartup.cpp | 17 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 8 | 
12 files changed, 75 insertions, 309 deletions
| diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index ac5c5c6a2a..2dc8db0434 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -49,6 +49,9 @@ INCLUDE(GoogleMock)      ${GOOGLEMOCK_INCLUDE_DIRS}      )    SET(alltest_LIBRARIES +    ${BOOST_COROUTINE_LIBRARY} +    ${BOOST_CONTEXT_LIBRARY} +    ${BOOST_SYSTEM_LIBRARY}      ${GOOGLEMOCK_LIBRARIES}      ${PTHREAD_LIBRARY}      ${WINDOWS_LIBRARIES} diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index fc51d147a6..e08127eebf 100755 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -52,7 +52,6 @@ set(llmessage_SOURCE_FILES      llhttpconstants.cpp      llhttpnode.cpp      llhttpsdhandler.cpp -    llhttpsender.cpp      llinstantmessage.cpp      lliobuffer.cpp      lliohttpserver.cpp @@ -147,7 +146,6 @@ set(llmessage_HEADER_FILES      llhttpnode.h      llhttpnodeadapter.h      llhttpsdhandler.h -    llhttpsender.h      llinstantmessage.h      llinvite.h      lliobuffer.h @@ -233,6 +231,9 @@ target_link_libraries(    ${OPENSSL_LIBRARIES}    ${CRYPTO_LIBRARIES}    ${XMLRPCEPI_LIBRARIES} +  ${BOOST_COROUTINE_LIBRARY} +  ${BOOST_CONTEXT_LIBRARY} +  ${BOOST_SYSTEM_LIBRARY}    )  # tests diff --git a/indra/llmessage/llhost.h b/indra/llmessage/llhost.h index 0cf52a4151..9a221e2a6e 100755 --- a/indra/llmessage/llhost.h +++ b/indra/llmessage/llhost.h @@ -40,6 +40,7 @@ class LLHost {  protected:  	U32			mPort;  	U32         mIP; +    std::string mUntrustedSimCap;  public:  	static LLHost invalid; @@ -96,6 +97,9 @@ public:  	std::string getHostName() const;  	std::string getIPandPort() const; +    std::string getUntrustedSimulatorCap() const        { return mUntrustedSimCap; } +    void setUntrustedSimulatorCap(const std::string &capurl) { mUntrustedSimCap = capurl; } +  	friend std::ostream& operator<< (std::ostream& os, const LLHost &hh);  	// This operator is not well defined. does it expect a diff --git a/indra/llmessage/llhttpsender.cpp b/indra/llmessage/llhttpsender.cpp deleted file mode 100755 index 5363088d79..0000000000 --- a/indra/llmessage/llhttpsender.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/**  - * @file llhttpsender.cpp - * @brief Abstracts details of sending messages via HTTP. - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include "llhttpsender.h" - -#include <map> -#include <sstream> - -#include "llhost.h" -#include "llsd.h" - -namespace -{ -	typedef std::map<LLHost, LLHTTPSender*> SenderMap; -	static SenderMap senderMap; -	static LLPointer<LLHTTPSender> defaultSender(new LLHTTPSender()); -} - -//virtual  -LLHTTPSender::~LLHTTPSender() -{ -} - -//virtual  -void LLHTTPSender::send(const LLHost& host, const std::string& name,  -						const LLSD& body,  -						LLHTTPClient::ResponderPtr response) const -{ -	// Default implementation inserts sender, message and sends HTTP POST -	std::ostringstream stream; -	stream << "http://" << host << "/trusted-message/" << name; -	LL_INFOS() << "LLHTTPSender::send: POST to " << stream.str() << LL_ENDL; -	LLHTTPClient::post(stream.str(), body, response); -} - -//static  -void LLHTTPSender::setSender(const LLHost& host, LLHTTPSender* sender) -{ -	LL_INFOS() << "LLHTTPSender::setSender " << host << LL_ENDL; -	senderMap[host] = sender; -} - -//static -const LLHTTPSender& LLHTTPSender::getSender(const LLHost& host) -{ -	SenderMap::const_iterator iter = senderMap.find(host); -	if(iter == senderMap.end()) -	{ -		return *defaultSender; -	} -	return *(iter->second); -} - -//static  -void LLHTTPSender::clearSender(const LLHost& host) -{ -	SenderMap::iterator iter = senderMap.find(host); -	if(iter != senderMap.end()) -	{ -		delete iter->second; -		senderMap.erase(iter); -	} -} - -//static  -void LLHTTPSender::setDefaultSender(LLHTTPSender* sender) -{ -	defaultSender = sender; -} diff --git a/indra/llmessage/llhttpsender.h b/indra/llmessage/llhttpsender.h deleted file mode 100755 index ff8fa2f95b..0000000000 --- a/indra/llmessage/llhttpsender.h +++ /dev/null @@ -1,59 +0,0 @@ -/**  - * @file llhttpsender.h - * @brief Abstracts details of sending messages via HTTP. - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_HTTP_SENDER_H -#define LL_HTTP_SENDER_H - -#include "llhttpclient.h" - -class LLHost; -class LLSD; - -class LLHTTPSender : public LLThreadSafeRefCount -{ - public: - -	virtual ~LLHTTPSender(); - -	/** @brief Send message to host with body, call response when done */  -	virtual void send(const LLHost& host,  -					  const std::string& message, const LLSD& body,  -					  LLHTTPClient::ResponderPtr response) const; - -	/** @brief Set sender for host, takes ownership of sender. */ -	static void setSender(const LLHost& host, LLHTTPSender* sender); - -	/** @brief Get sender for host, retains ownership of returned sender. */ -	static const LLHTTPSender& getSender(const LLHost& host); -	 -	/** @brief Clear sender for host. */ -	static void clearSender(const LLHost& host); - -	/** @brief Set default sender, takes ownership of sender. */ -	static void setDefaultSender(LLHTTPSender* sender); -}; - -#endif // LL_HTTP_SENDER_H diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index e9ce94ab3b..8c2d3f12d4 100755 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -52,7 +52,6 @@  #include "llfasttimer.h"  #include "llhttpclient.h"  #include "llhttpnodeadapter.h" -#include "llhttpsender.h"  #include "llmd5.h"  #include "llmessagebuilder.h"  #include "llmessageconfig.h" @@ -77,6 +76,7 @@  #include "v3math.h"  #include "v4math.h"  #include "lltransfertargetvfile.h" +#include "llcorehttputil.h"  // Constants  //const char* MESSAGE_LOG_FILENAME = "message.log"; @@ -1129,29 +1129,6 @@ S32 LLMessageSystem::flushReliable(const LLHost &host)  	return send_bytes;  } -LLHTTPClient::ResponderPtr LLMessageSystem::createResponder(const std::string& name) -{ -	if(mSendReliable) -	{ -		return new LLFnPtrResponder( -			mReliablePacketParams.mCallback, -			mReliablePacketParams.mCallbackData, -			name); -	} -	else -	{ -		// These messages aren't really unreliable, they just weren't -		// explicitly sent as reliable, so they don't have a callback -//		LL_WARNS("Messaging") << "LLMessageSystem::sendMessage: Sending unreliable " -//				<< mMessageBuilder->getMessageName() << " message via HTTP" -//				<< LL_ENDL; -		return new LLFnPtrResponder( -			NULL, -			NULL, -			name); -	} -} -  // This can be called from signal handlers,  // so should should not use LL_INFOS().  S32 LLMessageSystem::sendMessage(const LLHost &host) @@ -1213,16 +1190,21 @@ S32 LLMessageSystem::sendMessage(const LLHost &host)  	}  	// NOTE: babbage: LLSD message -> HTTP, template message -> UDP -	if(mMessageBuilder == mLLSDMessageBuilder) +//	if(mMessageBuilder == mLLSDMessageBuilder) +  if (!host.getUntrustedSimulatorCap().empty())  	{  		LLSD message = mLLSDMessageBuilder->getMessage(); -		 -		const LLHTTPSender& sender = LLHTTPSender::getSender(host); -		sender.send( -			host, -			mLLSDMessageBuilder->getMessageName(), -			message, -			createResponder(mLLSDMessageBuilder->getMessageName())); + +        UntrustedCallback_t cb = NULL; +        if ((mSendReliable) && (mReliablePacketParams.mCallback)) +        { +            cb = boost::bind(mReliablePacketParams.mCallback, mReliablePacketParams.mCallbackData, _1); +        } + +        LLCoros::instance().launch("LLMessageSystem::sendUntrustedSimulatorMessageCoro", +            boost::bind(&LLMessageSystem::sendUntrustedSimulatorMessageCoro, this,  +            host.getUntrustedSimulatorCap(),  +            mLLSDMessageBuilder->getMessageName(), message, cb));  		mSendReliable = FALSE;  		mReliablePacketParams.clear(); @@ -1410,9 +1392,16 @@ S32 LLMessageSystem::sendMessage(  		return 0;  	} -	const LLHTTPSender& sender = LLHTTPSender::getSender(host); -	sender.send(host, name, message, createResponder(name)); -	return 1; +    UntrustedCallback_t cb = NULL; +    if ((mSendReliable) && (mReliablePacketParams.mCallback)) +    { +        cb = boost::bind(mReliablePacketParams.mCallback, mReliablePacketParams.mCallbackData, _1); +    } + +    LLCoros::instance().launch("LLMessageSystem::sendUntrustedSimulatorMessageCoro", +            boost::bind(&LLMessageSystem::sendUntrustedSimulatorMessageCoro, this, +            host.getUntrustedSimulatorCap(), name, message, cb)); +    return 1;  }  void LLMessageSystem::logTrustedMsgFromUntrustedCircuit( const LLHost& host ) @@ -4055,6 +4044,36 @@ const LLHost& LLMessageSystem::getSender() const  	return mLastSender;  } +void LLMessageSystem::sendUntrustedSimulatorMessageCoro(std::string url, std::string message, LLSD body, UntrustedCallback_t callback) +{ +    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t +        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy)); +    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); +    LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + + +    if (url.empty()) +    { +        LL_WARNS() << "sendUntrustedSimulatorMessageCoro called with empty capability!" << LL_ENDL; +        return; +    } + +    LL_INFOS() << "sendUntrustedSimulatorMessageCoro: message " << message << " to cap " << url << LL_ENDL; +    LLSD postData; +    postData["message"] = message; +    postData["body"] = body; + +    LLSD result = httpAdapter->postAndYield(httpRequest, url, postData, httpOpts); + +    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + +    if ((callback) && (!callback.empty())) +        callback((status) ? LL_ERR_NOERR : LL_ERR_TCP_TIMEOUT); +} + +  LLHTTPRegistration<LLHTTPNodeAdapter<LLTrustedMessageService> >  	gHTTPRegistrationTrustedMessageWildcard("/trusted-message/<message-name>"); diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h index 348b09b992..c1ab67b5a1 100755 --- a/indra/llmessage/message.h +++ b/indra/llmessage/message.h @@ -60,6 +60,8 @@  #include "llmessagesenderinterface.h"  #include "llstoredmessage.h" +#include "llcoros.h" +#include "lleventcoro.h"  const U32 MESSAGE_MAX_STRINGS_LENGTH = 64;  const U32 MESSAGE_NUMBER_OF_HASH_BUCKETS = 8192; @@ -489,7 +491,6 @@ public:  		void (*callback)(void **,S32),   		void ** callback_data); -	LLCurl::ResponderPtr createResponder(const std::string& name);  	S32		sendMessage(const LLHost &host);  	S32		sendMessage(const U32 circuit);  private: @@ -740,6 +741,9 @@ public:  	void receivedMessageFromTrustedSender();  private: +    typedef boost::function<void(S32)>  UntrustedCallback_t; +    void sendUntrustedSimulatorMessageCoro(std::string url, std::string message, LLSD body, UntrustedCallback_t callback); +  	bool mLastMessageFromTrustedMessageService; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4a91969bb7..3a6a1d4d64 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -140,7 +140,6 @@ set(viewer_SOURCE_FILES      llbuycurrencyhtml.cpp      llcallbacklist.cpp      llcallingcard.cpp -    llcaphttpsender.cpp      llchannelmanager.cpp      llchatbar.cpp      llchathistory.cpp @@ -751,7 +750,6 @@ set(viewer_HEADER_FILES      llcallbacklist.h      llcallingcard.h      llcapabilityprovider.h -    llcaphttpsender.h      llchannelmanager.h      llchatbar.h      llchathistory.h diff --git a/indra/newview/llcaphttpsender.cpp b/indra/newview/llcaphttpsender.cpp deleted file mode 100755 index b2524d14f8..0000000000 --- a/indra/newview/llcaphttpsender.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/**  - * @file llcaphttpsender.cpp - * @brief Abstracts details of sending messages via UntrustedMessage cap. - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llcaphttpsender.h" - -#include "llhost.h" - -LLCapHTTPSender::LLCapHTTPSender(const std::string& cap) : -	mCap(cap) -{ -} - -//virtual  -void LLCapHTTPSender::send(const LLHost& host, const std::string& message,  -								  const LLSD& body,  -								  LLHTTPClient::ResponderPtr response) const -{ -	LL_INFOS() << "LLCapHTTPSender::send: message " << message -			<< " to host " << host << LL_ENDL; -	LLSD llsd; -	llsd["message"] = message; -	llsd["body"] = body; -	LLHTTPClient::post(mCap, llsd, response); -} diff --git a/indra/newview/llcaphttpsender.h b/indra/newview/llcaphttpsender.h deleted file mode 100755 index e1f4c813f6..0000000000 --- a/indra/newview/llcaphttpsender.h +++ /dev/null @@ -1,48 +0,0 @@ -/**  - * @file llcaphttpsender.h - * @brief Abstracts details of sending messages via the - *        UntrustedMessage capability. - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_CAP_HTTP_SENDER_H -#define LL_CAP_HTTP_SENDER_H - -#include "llhttpsender.h" - -class LLCapHTTPSender : public LLHTTPSender -{ -public: -	LLCapHTTPSender(const std::string& cap); - -	/** @brief Send message via UntrustedMessage capability with body, -		call response when done */  -	virtual void send(const LLHost& host,  -					  const std::string& message, const LLSD& body,  -					  LLHTTPClient::ResponderPtr response) const; - -private: -	std::string mCap; -}; - -#endif // LL_CAP_HTTP_SENDER_H diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6622fa7d9c..8f856b1300 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -56,7 +56,6 @@  #include "llerrorcontrol.h"  #include "llfloaterreg.h"  #include "llfocusmgr.h" -#include "llhttpsender.h"  #include "llfloaterimsession.h"  #include "lllocationhistory.h"  #include "llimageworker.h" @@ -291,20 +290,6 @@ void callback_cache_name(const LLUUID& id, const std::string& full_name, bool is  // local classes  // -namespace -{ -	class LLNullHTTPSender : public LLHTTPSender -	{ -		virtual void send(const LLHost& host,  -						  const std::string& message, const LLSD& body,  -						  LLHTTPClient::ResponderPtr response) const -		{ -			LL_WARNS("AppInit") << " attemped to send " << message << " to " << host -					<< " with null sender" << LL_ENDL; -		} -	}; -} -  void update_texture_fetch()  {  	LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread @@ -510,8 +495,6 @@ bool idle_startup()  			    port = gSavedSettings.getU32("ConnectionPort");  			  } -			LLHTTPSender::setDefaultSender(new LLNullHTTPSender()); -  			// TODO parameterize   			const F32 circuit_heartbeat_interval = 5;  			const F32 circuit_timeout = 100; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 32b57dae25..cb42110510 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -47,7 +47,6 @@  #include "llagentcamera.h"  #include "llavatarrenderinfoaccountant.h"  #include "llcallingcard.h" -#include "llcaphttpsender.h"  #include "llcommandhandler.h"  #include "lldir.h"  #include "lleventpoll.h" @@ -611,8 +610,9 @@ LLViewerRegion::~LLViewerRegion()  	delete mParcelOverlay;  	delete mImpl->mLandp;  	delete mImpl->mEventPoll; +#if 0  	LLHTTPSender::clearSender(mImpl->mHost); -	 +#endif	  	std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer());  	saveObjectCache(); @@ -2941,7 +2941,11 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u  	}  	else if(name == "UntrustedSimulatorMessage")  	{ +#if 1 +        mImpl->mHost.setUntrustedSimulatorCap(url); +#else  		LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url)); +#endif  	}  	else if (name == "SimulatorFeatures")  	{ | 
