diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2010-01-12 15:27:01 -0500 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2010-01-12 15:27:01 -0500 |
commit | 7b03037cacc99c975624c44eef3c9071198adeed (patch) | |
tree | 8212dd626860174558885bddc06e75b72316ca74 /indra | |
parent | 3b2697cb93e6b8a1f1281aeab0e960bc6704d8c4 (diff) |
EXT-4193: Use different reply pumps for SRV and XMLRPC requests.
This eliminates the timing hole (introduced by EXT-3934 fix) in which a
belated SRV response could confuse the XMLRPC response code.
Extend unit tests to positively drive the bug and validate the fix.
Diffstat (limited to 'indra')
-rw-r--r-- | indra/viewer_components/login/lllogin.cpp | 16 | ||||
-rw-r--r-- | indra/viewer_components/login/tests/lllogin_test.cpp | 12 |
2 files changed, 19 insertions, 9 deletions
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index f5bda71846..b9f61ca7e1 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -143,7 +143,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential << " with uri '" << uri << "', credentials " << printable_credentials << LL_ENDL; // Arriving in SRVRequest state - LLEventStream replyPump("reply", true); + LLEventStream replyPump("SRVreply", true); // Should be an array of one or more uri strings. LLSD rewrittenURIs; { @@ -181,6 +181,10 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential } // we no longer need the filter LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction")); + // EXT-4193: use a DIFFERENT reply pump than for the SRV request. We used + // to share them -- but the EXT-3934 fix made it possible for an abandoned + // SRV response to arrive just as we were expecting the XMLRPC response. + LLEventStream loginReplyPump("loginreply", true); // Loop through the rewrittenURIs, counting attempts along the way. // Because of possible redirect responses, we may make more than one @@ -191,7 +195,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential urit != urend; ++urit) { LLSD request(credentials); - request["reply"] = replyPump.getName(); + request["reply"] = loginReplyPump.getName(); request["uri"] = *urit; std::string status; @@ -216,11 +220,11 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential // possible for the reply to arrive before the post() call // returns. Subsequent responses, of course, must be awaited // without posting again. - for (mAuthResponse = validateResponse(replyPump.getName(), - postAndWait(self, request, xmlrpcPump, replyPump, "reply")); + for (mAuthResponse = validateResponse(loginReplyPump.getName(), + postAndWait(self, request, xmlrpcPump, loginReplyPump, "reply")); mAuthResponse["status"].asString() == "Downloading"; - mAuthResponse = validateResponse(replyPump.getName(), - waitForEventOn(self, replyPump))) + mAuthResponse = validateResponse(loginReplyPump.getName(), + waitForEventOn(self, loginReplyPump))) { // Still Downloading -- send progress update. sendProgressEvent("offline", "downloading"); diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp index 8463e6d2ca..51f5cd0692 100644 --- a/indra/viewer_components/login/tests/lllogin_test.cpp +++ b/indra/viewer_components/login/tests/lllogin_test.cpp @@ -441,8 +441,8 @@ namespace tut // Testing normal login procedure. LLEventStream llaresPump("LLAres"); // Dummy LLAres pump. - // LLAresListener dummyLLAres("dummy_llares"); - // dummyLLAres.listenTo(llaresPump); + LLAresListener dummyLLAres("dummy_llares"); + dummyLLAres.listenTo(llaresPump); LLLogin login; LoginListener listener("test_ear"); @@ -470,6 +470,12 @@ namespace tut // the original URI. ensure_equals("Auth state", listener.lastEvent()["change"].asString(), "authenticating"); ensure_equals("Attempt", listener.lastEvent()["data"]["attempt"].asInteger(), 1); - ensure_equals("URI", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.bar.com"); + ensure_equals("URI", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.bar.com"); + + // EXT-4193: if the SRV reply isn't lost but merely late, and if it + // arrives just at the moment we're expecting the XMLRPC reply, the + // original code got confused and crashed. Drive that case here. We + // observe that without the fix, this call DOES repro. + dummyLLAres.sendReply(); } } |