Commit b15024be authored by Yang Tse's avatar Yang Tse
Browse files

sws.c: improve proxy mode torture testing support - followup to 18c6c8a5

parent 21401840
Loading
Loading
Loading
Loading
+41 −31
Original line number Diff line number Diff line
@@ -1184,8 +1184,7 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)
  const char *op_br = "";
  const char *cl_br = "";
#ifdef TCP_NODELAY
  curl_socklen_t flag = 1;
  int level = IPPROTO_TCP;
  curl_socklen_t flag;
#endif

#ifdef ENABLE_IPV6
@@ -1218,9 +1217,12 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)

#ifdef TCP_NODELAY
  /* Disable the Nagle algorithm */
  if(setsockopt(serverfd, level, TCP_NODELAY,
                (void *)&flag, sizeof(flag)) < 0)
  flag = 1;
  if(0 != setsockopt(serverfd, IPPROTO_TCP, TCP_NODELAY,
                     (void *)&flag, sizeof(flag)))
    logmsg("====> TCP_NODELAY for server conection failed");
  else
    logmsg("TCP_NODELAY set for server conection");
#endif

#ifdef ENABLE_IPV6
@@ -1304,8 +1306,7 @@ static void http_connect(curl_socket_t *infdp,
  bool poll_client_wr[2] = { TRUE, TRUE };
  bool poll_server_wr[2] = { TRUE, TRUE };
#ifdef TCP_NODELAY
  curl_socklen_t flag = 1;
  int level = IPPROTO_TCP;
  curl_socklen_t flag;
#endif
  bool primary = FALSE;
  bool secondary = FALSE;
@@ -1319,7 +1320,7 @@ static void http_connect(curl_socket_t *infdp,
  /* Sleep here to make sure the client reads CONNECT response's
     'end of headers' separate from the server data that follows.
     This is done to prevent triggering libcurl known bug #39. */
  for(loop = 2; loop && !got_exit_signal; loop--)
  for(loop = 2; (loop > 0) && !got_exit_signal; loop--)
    wait_ms(250);
  if(got_exit_signal)
    goto http_connect_cleanup;
@@ -1417,15 +1418,22 @@ static void http_connect(curl_socket_t *infdp,
          logmsg("====> Client connect DATA");
#ifdef TCP_NODELAY
          /* Disable the Nagle algorithm */
          if(setsockopt(datafd, level, TCP_NODELAY,
                        (void *)&flag, sizeof(flag)) < 0)
            logmsg("====> TCP_NODELAY for client conection failed");
          flag = 1;
          if(0 != setsockopt(datafd, IPPROTO_TCP, TCP_NODELAY,
                             (void *)&flag, sizeof(flag)))
            logmsg("====> TCP_NODELAY for client DATA conection failed");
          else
            logmsg("TCP_NODELAY set for client DATA conection");
#endif
          req2.pipelining = FALSE;
          err = get_request(datafd, &req2);
          if(!err) {
            err = send_doc(datafd, &req2);
            if(!err && (req2.testno == DOCNUMBER_CONNECT)) {
              /* sleep to prevent triggering libcurl known bug #39. */
              for(loop = 2; (loop > 0) && !got_exit_signal; loop--)
                wait_ms(250);
              if(!got_exit_signal) {
                /* connect to the server */
                serverfd[DATA] = connect_to(ipaddr, req2.connect_port);
                if(serverfd[DATA] != CURL_SOCKET_BAD) {
@@ -1443,6 +1451,7 @@ static void http_connect(curl_socket_t *infdp,
                }
              }
            }
          }
          if(datafd != CURL_SOCKET_BAD) {
            /* secondary tunnel not established */
            shutdown(datafd, SHUT_RDWR);
@@ -1542,7 +1551,7 @@ static void http_connect(curl_socket_t *infdp,

      /* endpoint read/write disabling, endpoint closing and tunnel teardown */
      for(i = 0; i <= max_tunnel_idx; i++) {
        for(loop = 2; loop; loop--) {
        for(loop = 2; loop > 0; loop--) {
          /* loop twice to satisfy condition interdependencies without
             having to await select timeout or another socket event */
          if(clientfd[i] != CURL_SOCKET_BAD) {
@@ -1580,7 +1589,7 @@ static void http_connect(curl_socket_t *infdp,

      /* socket clearing */
      for(i = 0; i <= max_tunnel_idx; i++) {
        for(loop = 2; loop; loop--) {
        for(loop = 2; loop > 0; 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));
@@ -1891,10 +1900,11 @@ int main(int argc, char *argv[])
     * response in many small segments to torture the clients more.
     */
    flag = 1;
    if (setsockopt(msgsock, IPPROTO_TCP, TCP_NODELAY,
                   (void *)&flag, sizeof(flag)) == -1) {
    if(0 != setsockopt(msgsock, IPPROTO_TCP, TCP_NODELAY,
                       (void *)&flag, sizeof(flag)))
      logmsg("====> TCP_NODELAY failed");
    }
    else
      logmsg("TCP_NODELAY set");
#endif

    /* initialization of httprequest struct is done in get_request(), but due