sws.c: improve proxy mode torture testing support - followup to d4bf87dc
authorYang Tse <yangsita@gmail.com>
Sun, 15 Jan 2012 19:13:32 +0000 (20:13 +0100)
committerYang Tse <yangsita@gmail.com>
Sun, 15 Jan 2012 19:13:32 +0000 (20:13 +0100)
tests/server/sws.c

index 5f6346e..42fd203 100644 (file)
@@ -1403,10 +1403,13 @@ static void http_connect(curl_socket_t *infdp,
 
     if(rc > 0) {
       /* socket action */
+      bool tcp_fin_wr;
 
       if(got_exit_signal)
         break;
 
+      tcp_fin_wr = FALSE;
+
       /* ---------------------------------------------------------- */
 
       /* passive mode FTP may establish a secondary tunnel */
@@ -1505,6 +1508,7 @@ static void http_connect(curl_socket_t *infdp,
               logmsg("[%s] got %zd, STOP WRITING client", data_or_ctrl(i), rc);
               shutdown(clientfd[i], SHUT_WR);
               poll_client_wr[i] = FALSE;
+              tcp_fin_wr = TRUE;
             }
             else {
               logmsg("[%s] SENT %zd bytes to client", data_or_ctrl(i), rc);
@@ -1524,6 +1528,7 @@ static void http_connect(curl_socket_t *infdp,
               logmsg("[%s] got %zd, STOP WRITING server", data_or_ctrl(i), rc);
               shutdown(serverfd[i], SHUT_WR);
               poll_server_wr[i] = FALSE;
+              tcp_fin_wr = TRUE;
             }
             else {
               logmsg("[%s] SENT %zd bytes to server", data_or_ctrl(i), rc);
@@ -1557,7 +1562,34 @@ static void http_connect(curl_socket_t *infdp,
               logmsg("[%s] DISABLED WRITING client", data_or_ctrl(i));
               shutdown(clientfd[i], SHUT_WR);
               poll_client_wr[i] = FALSE;
+              tcp_fin_wr = TRUE;
             }
+          }
+          if(serverfd[i] != CURL_SOCKET_BAD) {
+            if(poll_server_rd[i] && !poll_client_wr[i]) {
+              logmsg("[%s] DISABLED READING server", data_or_ctrl(i));
+              shutdown(serverfd[i], SHUT_RD);
+              poll_server_rd[i] = FALSE;
+            }
+            if(poll_server_wr[i] && !poll_client_rd[i] && !tos[i]) {
+              logmsg("[%s] DISABLED WRITING server", data_or_ctrl(i));
+              shutdown(serverfd[i], SHUT_WR);
+              poll_server_wr[i] = FALSE;
+              tcp_fin_wr = TRUE;
+            }
+          }
+        }
+      }
+
+      if(tcp_fin_wr)
+        /* allow kernel to place FIN bit packet on the wire */
+        wait_ms(250);
+
+      /* socket clearing */
+      for(i = 0; i <= max_tunnel_idx; i++) {
+        int loop;
+        for(loop = 2; loop; loop--) {
+          if(clientfd[i] != CURL_SOCKET_BAD) {
             if(!poll_client_wr[i] && !poll_client_rd[i]) {
               logmsg("[%s] CLOSING client socket", data_or_ctrl(i));
               sclose(clientfd[i]);
@@ -1572,16 +1604,6 @@ static void http_connect(curl_socket_t *infdp,
             }
           }
           if(serverfd[i] != CURL_SOCKET_BAD) {
-            if(poll_server_rd[i] && !poll_client_wr[i]) {
-              logmsg("[%s] DISABLED READING server", data_or_ctrl(i));
-              shutdown(serverfd[i], SHUT_RD);
-              poll_server_rd[i] = FALSE;
-            }
-            if(poll_server_wr[i] && !poll_client_rd[i] && !tos[i]) {
-              logmsg("[%s] DISABLED WRITING server", data_or_ctrl(i));
-              shutdown(serverfd[i], SHUT_WR);
-              poll_server_wr[i] = FALSE;
-            }
             if(!poll_server_wr[i] && !poll_server_rd[i]) {
               logmsg("[%s] CLOSING server socket", data_or_ctrl(i));
               sclose(serverfd[i]);