Backed out changeset b29865f8d36b (bug 1356611) for frequent windows xpcshell failures a=backout
authorWes Kocher <wkocher@mozilla.com>
Sat, 15 Apr 2017 00:32:29 -0700
changeset 563313 292f19781579c259c19039d65f73ee6a6360a21c
parent 563312 fc91bd1a27a72e451c435acede23ecff374e56e7
child 563314 9a16c329034e5793a14a8aba3d003b657bf6553e
push id54258
push usercpeterson@mozilla.com
push dateSun, 16 Apr 2017 05:52:14 +0000
reviewersbackout
bugs1356611
milestone55.0a1
backs outb29865f8d36bbe4526bc7674914a2b1a9dd20ead
Backed out changeset b29865f8d36b (bug 1356611) for frequent windows xpcshell failures a=backout
netwerk/protocol/http/Http2Session.cpp
netwerk/protocol/http/Http2Session.h
--- a/netwerk/protocol/http/Http2Session.cpp
+++ b/netwerk/protocol/http/Http2Session.cpp
@@ -84,17 +84,16 @@ Http2Session::Http2Session(nsISocketTran
   , mDownstreamRstReason(NO_HTTP_ERROR)
   , mExpectedHeaderID(0)
   , mExpectedPushPromiseID(0)
   , mContinuedPromiseStream(0)
   , mFlatHTTPResponseHeadersOut(0)
   , mShouldGoAway(false)
   , mClosed(false)
   , mCleanShutdown(false)
-  , mReceivedSettings(false)
   , mTLSProfileConfirmed(false)
   , mGoAwayReason(NO_HTTP_ERROR)
   , mClientGoAwayReason(UNASSIGNED)
   , mPeerGoAwayReason(UNASSIGNED)
   , mGoAwayID(0)
   , mOutgoingGoAwayID(0)
   , mConcurrent(0)
   , mServerPushedResources(0)
@@ -1500,18 +1499,16 @@ Http2Session::RecvSettings(Http2Session 
   if (self->mInputFrameDataSize % 6) {
     // Number of Settings is determined by dividing by each 6 byte setting
     // entry. So the payload must be a multiple of 6.
     LOG3(("Http2Session::RecvSettings %p SETTINGS wrong length data=%d",
           self, self->mInputFrameDataSize));
     RETURN_SESSION_ERROR(self, PROTOCOL_ERROR);
   }
 
-  self->mReceivedSettings = true;
-
   uint32_t numEntries = self->mInputFrameDataSize / 6;
   LOG3(("Http2Session::RecvSettings %p SETTINGS Control Frame "
         "with %d entries ack=%X", self, numEntries,
         self->mInputFrameFlags & kFlag_ACK));
 
   if ((self->mInputFrameFlags & kFlag_ACK) && self->mInputFrameDataSize) {
     LOG3(("Http2Session::RecvSettings %p ACK with non zero payload is err\n", self));
     RETURN_SESSION_ERROR(self, PROTOCOL_ERROR);
@@ -4151,96 +4148,94 @@ Http2Session::TestOriginFrame(const nsAC
     LOG3(("TestOriginFrame() %p sni test %d\n", this, rv));
   }
   return rv;
 }
 
 bool
 Http2Session::TestJoinConnection(const nsACString &hostname, int32_t port)
 {
-  return RealJoinConnection(hostname, port, true);
-}
-
-bool
-Http2Session::JoinConnection(const nsACString &hostname, int32_t port)
-{
-  return RealJoinConnection(hostname, port, false);
-}
-
-bool
-Http2Session::RealJoinConnection(const nsACString &hostname, int32_t port,
-                                 bool justKidding)
-{
-  if (!mConnection || mClosed || mShouldGoAway || !mReceivedSettings) {
+  if (!mConnection || mClosed || mShouldGoAway) {
     return false;
   }
+
   if (mOriginFrameActivated) {
     bool originFrameResult = TestOriginFrame(hostname, port);
     if (!originFrameResult) {
       return false;
     }
   } else {
-    LOG3(("JoinConnection %p no origin frame check used.\n", this));
-  }
-
-  nsAutoCString key(hostname);
-  key.Append(':');
-  key.Append(justKidding ? 'k' : '.');
-  key.AppendInt(port);
-  bool cachedResult;
-  if (mJoinConnectionCache.Get(key, &cachedResult)) {
-    LOG(("joinconnection [%p %s] %s result=%d cache\n",
-         this, ConnectionInfo()->HashKey().get(), key.get(),
-         cachedResult));
-    return cachedResult;
+    LOG3(("TestJoinConnection %p no origin frame check used.\n", this));
   }
 
   nsresult rv;
   bool isJoined = false;
 
   nsCOMPtr<nsISupports> securityInfo;
   nsCOMPtr<nsISSLSocketControl> sslSocketControl;
 
   mConnection->GetSecurityInfo(getter_AddRefs(securityInfo));
   sslSocketControl = do_QueryInterface(securityInfo, &rv);
   if (NS_FAILED(rv) || !sslSocketControl) {
     return false;
   }
 
   // try all the coalescable versions we support.
   const SpdyInformation *info = gHttpHandler->SpdyInfo();
-  static_assert(SpdyInformation::kCount == 1, "assume 1 alpn version");
-  bool joinedReturn = false;
-  if (info->ProtocolEnabled(0)) {
-    if (justKidding) {
-      rv = sslSocketControl->TestJoinConnection(info->VersionString[0],
+  for (uint32_t index = SpdyInformation::kCount; index > 0; --index) {
+    if (info->ProtocolEnabled(index - 1)) {
+      rv = sslSocketControl->TestJoinConnection(info->VersionString[index - 1],
                                                 hostname, port, &isJoined);
-    } else {
-      rv = sslSocketControl->JoinConnection(info->VersionString[0],
-                                            hostname, port, &isJoined);
-    }
-    if (NS_SUCCEEDED(rv) && isJoined) {
-      joinedReturn = true;
+      if (NS_SUCCEEDED(rv) && isJoined) {
+        return true;
+      }
     }
   }
-
-  LOG(("joinconnection [%p %s] %s result=%d lookup\n",
-       this, ConnectionInfo()->HashKey().get(), key.get(), joinedReturn));
-  mJoinConnectionCache.Put(key, joinedReturn);
-  if (!justKidding) {
-    // cache a kidding entry too as this one is good for both
-    nsAutoCString key2(hostname);
-    key2.Append(':');
-    key2.Append('k');
-    key2.AppendInt(port);
-    if (!mJoinConnectionCache.Get(key2)) {
-      mJoinConnectionCache.Put(key2, joinedReturn);
+  return false;
+}
+
+bool
+Http2Session::JoinConnection(const nsACString &hostname, int32_t port)
+{
+  if (!mConnection || mClosed || mShouldGoAway) {
+    return false;
+  }
+  if (mOriginFrameActivated) {
+    bool originFrameResult = TestOriginFrame(hostname, port);
+    if (!originFrameResult) {
+      return false;
+    }
+  } else {
+    LOG3(("JoinConnection %p no origin frame check used.\n", this));
+  }
+
+  nsresult rv;
+  bool isJoined = false;
+
+  nsCOMPtr<nsISupports> securityInfo;
+  nsCOMPtr<nsISSLSocketControl> sslSocketControl;
+
+  mConnection->GetSecurityInfo(getter_AddRefs(securityInfo));
+  sslSocketControl = do_QueryInterface(securityInfo, &rv);
+  if (NS_FAILED(rv) || !sslSocketControl) {
+    return false;
+  }
+
+  // try all the coalescable versions we support.
+  const SpdyInformation *info = gHttpHandler->SpdyInfo();
+  for (uint32_t index = SpdyInformation::kCount; index > 0; --index) {
+    if (info->ProtocolEnabled(index - 1)) {
+      rv = sslSocketControl->JoinConnection(info->VersionString[index - 1],
+                                            hostname, port, &isJoined);
+      if (NS_SUCCEEDED(rv) && isJoined) {
+        return true;
+      }
     }
   }
-  return joinedReturn;
+  return false;
 }
 
 void
 Http2Session::ThrottleResponse(bool aThrottle)
 {
   // Response throttling on an h2 connection will be implemented later.
 }
 
--- a/netwerk/protocol/http/Http2Session.h
+++ b/netwerk/protocol/http/Http2Session.h
@@ -422,19 +422,16 @@ private:
   bool                 mShouldGoAway;
 
   // the session has received a nsAHttpTransaction::Close()  call
   bool                 mClosed;
 
   // the session received a GoAway frame with a valid GoAwayID
   bool                 mCleanShutdown;
 
-  // the session received the opening SETTINGS frame from the server
-  bool                 mReceivedSettings;
-
   // The TLS comlpiance checks are not done in the ctor beacuse of bad
   // exception handling - so we do them at IO time and cache the result
   bool                 mTLSProfileConfirmed;
 
   // A specifc reason code for the eventual GoAway frame. If set to NO_HTTP_ERROR
   // only NO_HTTP_ERROR, PROTOCOL_ERROR, or INTERNAL_ERROR will be sent.
   errorType            mGoAwayReason;
 
@@ -516,23 +513,20 @@ private:
   bool mGoAwayOnPush;
 
   bool mUseH2Deps;
 
   bool mAttemptingEarlyData;
   // The ID(s) of the stream(s) that we are getting 0RTT data from.
   nsTArray<uint32_t> m0RTTStreams;
 
-  bool RealJoinConnection(const nsACString &hostname, int32_t port, bool jk);
   bool TestOriginFrame(const nsACString &name, int32_t port);
   bool mOriginFrameActivated;
   nsDataHashtable<nsCStringHashKey, bool> mOriginFrame;
 
-  nsDataHashtable<nsCStringHashKey, bool> mJoinConnectionCache;
-
 private:
 /// connect tunnels
   void DispatchOnTunnel(nsAHttpTransaction *, nsIInterfaceRequestor *);
   void CreateTunnel(nsHttpTransaction *, nsHttpConnectionInfo *, nsIInterfaceRequestor *);
   void RegisterTunnel(Http2Stream *);
   void UnRegisterTunnel(Http2Stream *);
   uint32_t FindTunnelCount(nsHttpConnectionInfo *);
   nsDataHashtable<nsCStringHashKey, uint32_t> mTunnelHash;