summaryrefslogtreecommitdiff
path: root/indra/llmessage
diff options
context:
space:
mode:
authorRider Linden <rider@lindenlab.com>2015-08-14 16:45:26 -0700
committerRider Linden <rider@lindenlab.com>2015-08-14 16:45:26 -0700
commitaa3042ea331479128a65d890d44314cc7c630e2c (patch)
treeae26d4686fe7a2da9b96c6e7df2c4f7ea5effcbc /indra/llmessage
parent248d61fe0eadd128c7704e37922ba7fdef35d630 (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/llmessage')
-rwxr-xr-xindra/llmessage/CMakeLists.txt5
-rwxr-xr-xindra/llmessage/llhost.h4
-rwxr-xr-xindra/llmessage/llhttpsender.cpp94
-rwxr-xr-xindra/llmessage/llhttpsender.h59
-rwxr-xr-xindra/llmessage/message.cpp89
-rwxr-xr-xindra/llmessage/message.h6
6 files changed, 66 insertions, 191 deletions
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;