[tor-commits] [tor-browser/tor-browser-38.4.0esr-5.5-1] fixup! Bug 3875: Use Optimistic Data SOCKS variant.

gk at torproject.org gk at torproject.org
Fri Dec 11 12:40:26 UTC 2015


commit bbd7c24a1019ecfac43aeaac959143b575cca07f
Author: Kathy Brade <brade at pearlcrescent.com>
Date:   Tue Nov 10 12:00:44 2015 -0500

    fixup! Bug 3875: Use Optimistic Data SOCKS variant.
    
    Avoid a CPU loop when processing HTTP requests, do not alter the
    behavior of the socket transport state machine when SOCKS is not
    being used, and improve comments. Fixes bug 9659.
---
 netwerk/base/nsSocketTransport2.cpp |   38 ++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/netwerk/base/nsSocketTransport2.cpp b/netwerk/base/nsSocketTransport2.cpp
index 07a92c4..c98365e 100644
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -1836,22 +1836,32 @@ nsSocketTransport::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
         mPollTimeout = mTimeouts[TIMEOUT_READ_WRITE];
     }
 
-//STATE_SENDINGGET: handshake proceeded to state "sent connect"
-//one more poll to OnSocketReady will trigger the get request, and state STATE_SENTGET
-//STATE_SENTGET: continue and finish handshake
+    // Tor 3875: Use optimistic data with SOCKS.
+    // To accomplish this, two new states were added that are only used with
+    // SOCKS connections:
+    //   STATE_SENDINGGET - The SOCKS handshake has proceeded to the
+    //                        "sent connect" state; now it is okay to
+    //                         optimistically send some application data (e.g.,
+    //                         an HTTP GET request).
+    //   STATE_SENTGET -    Optimistic data has been sent; make a second call
+    //                        to PR_ConnectContinue() to allow the SOCKS
+    //                        handshake to finish.
     else if (mState == STATE_SENDINGGET) {
         if ((mPollFlags & PR_POLL_WRITE) && (outFlags & ~PR_POLL_READ)) {
-            mOutput.OnSocketReady(NS_OK);
+            mOutput.OnSocketReady(NS_OK);  // Allow application data to be sent.
         }
         mPollTimeout = mTimeouts[TIMEOUT_READ_WRITE];
-        mState = STATE_SENTGET;
+        mPollFlags = (PR_POLL_EXCEPT | PR_POLL_READ);
+        mState = STATE_SENTGET;  // Wait for SOCKS handshake response.
     }
-
     else if (mState == STATE_CONNECTING || mState == STATE_SENTGET) {
         PRStatus status = PR_ConnectContinue(fd, outFlags);
+        bool isUsingSocks = mProxyTransparent && !mProxyHost.IsEmpty();
         if (status == PR_SUCCESS && mState == STATE_CONNECTING) {
             OnSocketConnected();
-            mState = STATE_SENDINGGET;
+            if (isUsingSocks) {
+                mState = STATE_SENDINGGET;
+            }
         }
         else if (status == PR_SUCCESS && mState == STATE_SENTGET) {
             //
@@ -1868,17 +1878,17 @@ nsSocketTransport::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
             // If the connect is still not ready, then continue polling...
             //
             if ((PR_WOULD_BLOCK_ERROR == code) || (PR_IN_PROGRESS_ERROR == code)) {
-                // Set up the select flags for connect...
-                mPollFlags = (PR_POLL_EXCEPT | PR_POLL_WRITE);
-                // Update poll timeout in case it was changed
-                mPollTimeout = mTimeouts[TIMEOUT_CONNECT];
+                if (mState != STATE_SENTGET) {
+                    // Set up the select flags for connect...
+                    mPollFlags = (PR_POLL_EXCEPT | PR_POLL_WRITE);
+                    // Update poll timeout in case it was changed
+                    mPollTimeout = mTimeouts[TIMEOUT_CONNECT];
+                }
             }
             //
             // The SOCKS proxy rejected our request. Find out why.
             //
-            else if (PR_UNKNOWN_ERROR == code &&
-                     mProxyTransparent &&
-                     !mProxyHost.IsEmpty()) {
+            else if (PR_UNKNOWN_ERROR == code && isUsingSocks) {
                 code = PR_GetOSError();
                 mCondition = ErrorAccordingToNSPR(code);
             }



More information about the tor-commits mailing list