aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/server/sws.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/tests/server/sws.c b/tests/server/sws.c
index 5f6346e8c..42fd2035a 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -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]);