You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2017/05/31 04:24:04 UTC

[trafficserver] branch master updated: jtest post feature

This is an automated email from the ASF dual-hosted git repository.

bcall pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

The following commit(s) were added to refs/heads/master by this push:
       new  d4be374   jtest post feature
d4be374 is described below

commit d4be374b8fac4e614d625dcd518d41385f555be4
Author: scw00 <61...@qq.com>
AuthorDate: Tue May 16 06:20:58 2017 +0800

    jtest post feature
---
 tools/jtest/jtest.cc | 375 ++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 283 insertions(+), 92 deletions(-)

diff --git a/tools/jtest/jtest.cc b/tools/jtest/jtest.cc
index 3bde9e1..1e53c2d 100644
--- a/tools/jtest/jtest.cc
+++ b/tools/jtest/jtest.cc
@@ -101,6 +101,8 @@
 #define MAX_DEFERED_URLS 10000
 #define DEFERED_URLS_BLOCK 2000
 
+#define MAX_REQUEST_BODY_LENGTH MAX_RESPONSE_LENGTH
+
 #define JTEST_DONE 0
 #define JTEST_CONT 1
 #define JTEST_ERR -1
@@ -236,6 +238,8 @@ static double evo_rate         = 0.0;
 static double zipf             = 0.0;
 static int zipf_bucket_size    = 1;
 static int range_mode          = 0;
+static int post_support        = 0;
+static int post_size           = 0;
 
 static const ArgumentDescription argument_descriptions[] = {
   {"proxy_port", 'p', "Proxy Port", "I", &proxy_port, "JTEST_PROXY_PORT", nullptr},
@@ -304,6 +308,9 @@ static const ArgumentDescription argument_descriptions[] = {
   {"evo_rate", '9', "Evolving Hotset Rate (evolutions/hour)", "D", &evo_rate, "JTEST_EVOLVING_HOTSET_RATE", nullptr},
   {"debug", 'd', "Debug Flag", "F", &debug, "JTEST_DEBUG", nullptr},
   {"range_mode", ' ', "Range Mode", "I", &range_mode, "JTEST_RANGE_MODE", nullptr},
+  {"post_support", ' ', "POST Mode (0 disable(default), 1 random, 2 specified size by post_size)", "I", &post_support,
+   "JTEST_POST_MODE", nullptr},
+  {"post_size", ' ', "POST SIZE", "I", &post_size, "JTEST_POST_SIZE", nullptr},
   HELP_ARGUMENT_DESCRIPTION(),
   VERSION_ARGUMENT_DESCRIPTION()};
 int n_argument_descriptions = countof(argument_descriptions);
@@ -348,7 +355,11 @@ struct FD {
   unsigned long range_bytes;
   unsigned long range_end;
   unsigned long range_start;
+  int post_size;
   int total_length;
+  int post_cl;
+  int send_header;
+  int header_size;
 
   void
   reset()
@@ -367,6 +378,8 @@ struct FD {
     range_bytes = 0;
     range_start = 0;
     range_end   = 0;
+    post_size   = 0;
+    send_header = 0;
 
     if (!urls_mode) {
       response = nullptr;
@@ -390,6 +403,8 @@ struct FD {
     ftp_peer_addr      = 0;
     ftp_peer_port      = 0;
     total_length       = 0;
+    post_cl            = 0;
+    header_size        = 0;
   }
 
   void close();
@@ -570,7 +585,7 @@ static void
 poll_init(int sock)
 {
   if (!fd[sock].req_header) {
-    fd[sock].req_header = (char *)malloc(HEADER_SIZE * pipeline);
+    fd[sock].req_header = (char *)malloc(HEADER_SIZE * pipeline + MAX_REQUEST_BODY_LENGTH);
   }
   if (!fd[sock].response_header) {
     fd[sock].response_header = (char *)malloc(HEADER_SIZE);
@@ -652,6 +667,9 @@ get_path_from_req(char *buf, char **purl_start, char **purl_end)
   if (!strncasecmp(url_start, "GET ", sizeof("GET ") - 1)) {
     url_start += sizeof("GET ") - 1;
     url_end = (char *)memchr(url_start, ' ', 70);
+  } else if (!strncasecmp(url_start, "POST ", sizeof("POST ") - 1)) {
+    url_start += sizeof("POST ") - 1;
+    url_end = (char *)memchr(url_start, ' ', 70);
   } else {
     url_end = (char *)memchr(url_start, 0, 70);
   }
@@ -981,27 +999,38 @@ send_ftp_data(int sock, char *start /*, char * end */)
   return 0;
 }
 
-static void
+static int
 process_header(int sock, char *buffer, int offset)
 {
   char host[80];
   int port, length;
   float r;
+  int post_request = 0;
   if (sscanf(buffer, "GET http://%[^:]:%d/%f/%d", host, &port, &r, &length) == 4) {
   } else if (sscanf(buffer, "GET /%f/%d", &r, &length) == 2) {
+  } else if (sscanf(buffer, "POST http://%[^:]:%d/%f/%d", host, &port, &r, &length) == 4) {
+    post_request = 1;
+  } else if (sscanf(buffer, "POST /%f/%d", &r, &length) == 2) {
+    post_request = 1;
   } else {
     if (verbose) {
       printf("misscan: %s\n", buffer);
     }
     fd[sock].close();
-    return;
+    return -1;
   }
 
   if (verbose) {
     printf("read_request %d got request %d\n", sock, length);
   }
-  char *ims   = strncasestr(buffer, "If-Modified-Since:", offset);
-  char *range = strncasestr(buffer, "Range:", offset);
+  char *ims     = strncasestr(buffer, "If-Modified-Since:", offset);
+  char *range   = strncasestr(buffer, "Range:", offset);
+  char *post_cl = nullptr;
+  if (post_support) {
+    post_cl          = strncasestr(buffer, "Content-Length:", offset);
+    fd[sock].post_cl = atoi(post_cl + strlen("Content-Length: "));
+    ink_assert(post_cl && post_request && fd[sock].post_cl);
+  }
   // coverity[dont_call]
   if (drand48() > ims_rate) {
     ims = nullptr;
@@ -1040,12 +1069,16 @@ process_header(int sock, char *buffer, int offset)
     fd[sock].response        = nullptr;
     fd[sock].response_length = fd[sock].length = 0;
   }
+  fd[sock].header_size = offset;
+
+  return post_request;
 }
 
 static int
 parse_header(int sock, int err)
 {
   int i;
+  int post_request = 0;
 
   if (verbose) {
     printf("read %d got %d\n", sock, err);
@@ -1088,7 +1121,15 @@ parse_header(int sock, int err)
           printf("Request from Proxy: {\n%s}\n", buffer);
         }
 
-        process_header(sock, buffer, i);
+        post_request = process_header(sock, buffer, i);
+        if (post_request < 0) {
+          return JTEST_DONE;
+        }
+
+        if (post_request) {
+          fd[sock].state = 4;
+          break;
+        }
 
         fd[sock].req_pos = 0;
         if (!check_keepalive(fd[sock].req_header, strlen(fd[sock].req_header))) {
@@ -1108,6 +1149,25 @@ parse_header(int sock, int err)
         fd[sock].state = 0;
       }
       break;
+    case 4:
+      if (fd[sock].req_pos - fd[sock].header_size - 1 >= fd[sock].post_cl) {
+        fd[sock].req_pos = 0;
+        if (!check_keepalive(fd[sock].req_header, strlen(fd[sock].req_header))) {
+          fd[sock].keepalive = 0;
+        } else {
+          fd[sock].keepalive--;
+        }
+        // coverity[dont_call]
+        if (fd[sock].length && drand48() < server_abort_rate) {
+          // coverity[dont_call]
+          fd[sock].length    = (int)(drand48() * (fd[sock].length - 1));
+          fd[sock].keepalive = 0;
+        }
+        poll_set(sock, nullptr, send_response);
+        fd[sock].state = 0;
+        return JTEST_DONE;
+      }
+      return JTEST_CONT;
     }
   }
   return JTEST_CONT;
@@ -1119,33 +1179,40 @@ read_request(int sock)
   if (verbose) {
     printf("read_request %d\n", sock);
   }
-  int err = 0;
+  int err     = 0;
+  int maxleft = 0;
 
-  int maxleft = HEADER_SIZE - fd[sock].req_pos - 1;
+  if (!post_support)
+    maxleft = HEADER_SIZE - fd[sock].req_pos - 1;
+  else
+    maxleft = HEADER_SIZE + MAX_REQUEST_BODY_LENGTH - fd[sock].req_pos - 1;
 
-  do {
-    err = read(sock, &fd[sock].req_header[fd[sock].req_pos], maxleft);
-  } while ((err < 0) && (errno == EINTR));
+  while (true) {
+    do {
+      err = read(sock, &fd[sock].req_header[fd[sock].req_pos], maxleft);
+    } while ((err < 0) && (errno == EINTR));
 
-  if (err < 0) {
-    if (errno == EAGAIN || errno == ENOTCONN) {
-      return 0;
-    }
-    if (fd[sock].req_pos || errno != ECONNRESET) {
-      perror("read");
-    }
-    return -1;
-  } else if (err == 0) {
-    if (verbose) {
-      printf("eof\n");
-    }
-    return -1;
-  } else {
-    if (verbose) {
-      printf("read %d got %d\n", sock, err);
-    }
+    if (err < 0) {
+      if (errno == EAGAIN || errno == ENOTCONN) {
+        return 0;
+      }
+      if (fd[sock].req_pos || errno != ECONNRESET) {
+        perror("read");
+      }
+      return -1;
+    } else if (err == 0) {
+      if (verbose) {
+        printf("eof\n");
+      }
+      return -1;
+    } else {
+      if (verbose) {
+        printf("read %d got %d\n", sock, err);
+      }
 
-    parse_header(sock, err);
+      if (parse_header(sock, err) == JTEST_DONE)
+        return 0;
+    }
   }
   return 0;
 }
@@ -2583,38 +2650,85 @@ write_request(int sock)
 {
   int err = 0;
 
-  do {
-    err = write(sock, fd[sock].req_header + fd[sock].req_pos, fd[sock].length - fd[sock].req_pos);
-  } while ((err == -1) && (errno == EINTR));
-  if (err <= 0) {
-    if (!err) {
-      if (verbose_errors) {
-        printf("write %d closed early\n", sock);
+  // send request header
+  if (!fd[sock].send_header) {
+    do {
+      err = write(sock, fd[sock].req_header + fd[sock].req_pos, fd[sock].length - fd[sock].req_pos);
+    } while ((err == -1) && (errno == EINTR));
+    if (err <= 0) {
+      if (!err) {
+        if (verbose_errors) {
+          printf("write %d closed early\n", sock);
+        }
+        goto Lerror;
+      }
+      if (errno == EAGAIN || errno == ENOTCONN) {
+        return 0;
       }
+      perror("write");
       goto Lerror;
     }
-    if (errno == EAGAIN || errno == ENOTCONN) {
-      return 0;
+    if (verbose) {
+      printf("write %d %d\n", sock, err);
+    }
+
+    new_tbytes += err;
+    total_client_request_bytes += err;
+    fd[sock].req_pos += err;
+    fd[sock].active = ink_get_hrtime_internal();
+
+    if (fd[sock].req_pos >= fd[sock].length) {
+      if (verbose) {
+        printf("write request header complete %d %d\n", sock, fd[sock].length);
+      }
+      fd[sock].req_pos = 0;
+      fd[sock].length  = fd[sock].response_length;
+      if (!post_support || !fd[sock].post_size) {
+        poll_set(sock, read_response);
+        return 0;
+      }
+      fd[sock].send_header = 1;
     }
-    perror("write");
-    goto Lerror;
-  }
-  if (verbose) {
-    printf("write %d %d\n", sock, err);
   }
 
-  new_tbytes += err;
-  total_client_request_bytes += err;
-  fd[sock].req_pos += err;
-  fd[sock].active = ink_get_hrtime_internal();
+  // send request body
+  ink_assert(MAX_RESPONSE_LENGTH > fd[sock].post_size);
 
-  if (fd[sock].req_pos >= fd[sock].length) {
+  if (fd[sock].send_header) {
+    do {
+      err = write(sock, response_buffer + fd[sock].req_pos, fd[sock].post_size - fd[sock].req_pos);
+    } while ((err == -1) && (errno == EINTR));
+    if (err <= 0) {
+      if (!err) {
+        if (verbose_errors) {
+          printf("write %d closed early\n", sock);
+        }
+        goto Lerror;
+      }
+      if (errno == EAGAIN || errno == ENOTCONN) {
+        return 0;
+      }
+      perror("write");
+      goto Lerror;
+    }
     if (verbose) {
-      printf("write complete %d %d\n", sock, fd[sock].length);
+      printf("write %d %d\n", sock, err);
+    }
+
+    new_tbytes += err;
+    total_client_request_bytes += err;
+    fd[sock].req_pos += err;
+    fd[sock].active = ink_get_hrtime_internal();
+
+    if (fd[sock].req_pos >= fd[sock].post_size) {
+      if (verbose) {
+        printf("write request body complete %d %d\n", sock, fd[sock].length);
+      }
+      fd[sock].send_header = 0;
+      fd[sock].req_pos     = 0;
+      fd[sock].length      = fd[sock].response_length;
+      poll_set(sock, read_response);
     }
-    fd[sock].req_pos = 0;
-    fd[sock].length  = fd[sock].response_length;
-    poll_set(sock, read_response);
   }
   return 0;
 Lerror:
@@ -2812,45 +2926,116 @@ make_random_url(int sock, double *dr, double *h)
   }
 }
 
-static void
+static int
 make_nohost_request(int sock, double dr, const char *evo_str, const char *extension, const char *eheaders, const char *rbuf,
                     const char *cookie)
 {
-  if (range_mode) {
-    sprintf(fd[sock].req_header, "GET http://%s:%d/%12.10f/%d%s%s HTTP/1.1\r\n"
-                                 "%s"
-                                 "%s"
-                                 "%s"
-                                 "%s"
-                                 "%s"
-                                 "%s"
-                                 "\r\n",
-            local_host, server_port, dr, fd[sock].response_length, evo_str, extension,
-            fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "Connection: close\r\n",
-            // coverity[dont_call]
-            reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, "Host: localhost\r\n", rbuf, cookie);
-  } else {
-    sprintf(fd[sock].req_header,
-            ftp ? "GET ftp://%s:%d/%12.10f/%d%s%s HTTP/1.0\r\n"
-                  "%s"
-                  "%s"
-                  "%s"
-                  "%s"
-                  "\r\n" :
-                  "GET http://%s:%d/%12.10f/%d%s%s HTTP/1.0\r\n"
-                  "%s"
-                  "%s"
-                  "%s"
-                  "%s"
-                  "\r\n",
-            local_host, server_port, dr, fd[sock].response_length, evo_str, extension,
-            fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "",
-            // coverity[dont_call]
-            reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, cookie);
+  int post_length = 0;
+
+  switch (post_support) {
+  case 0:
+    if (range_mode) {
+      sprintf(fd[sock].req_header, "GET http://%s:%d/%12.10f/%d%s%s HTTP/1.1\r\n"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "\r\n",
+              local_host, server_port, dr, fd[sock].response_length, evo_str, extension,
+              fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "Connection: close\r\n",
+              // coverity[dont_call]
+              reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, "Host: localhost\r\n", rbuf, cookie);
+    } else {
+      sprintf(fd[sock].req_header,
+              ftp ? "GET ftp://%s:%d/%12.10f/%d%s%s HTTP/1.0\r\n"
+                    "%s"
+                    "%s"
+                    "%s"
+                    "%s"
+                    "\r\n" :
+                    "GET http://%s:%d/%12.10f/%d%s%s HTTP/1.0\r\n"
+                    "%s"
+                    "%s"
+                    "%s"
+                    "%s"
+                    "\r\n",
+              local_host, server_port, dr, fd[sock].response_length, evo_str, extension,
+              fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "",
+              // coverity[dont_call]
+              reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, cookie);
+    }
+    break;
+  case 1:
+    if (range_mode) {
+      sprintf(fd[sock].req_header, "POST http://%s:%d/%12.10f/%d%s%s HTTP/1.1\r\n"
+                                   "Content-Length: %d\r\n"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "\r\n",
+              local_host, server_port, dr, fd[sock].response_length, evo_str, extension, fd[sock].response_length,
+              fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "Connection: close\r\n",
+              // coverity[dont_call]
+              reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, "Host: localhost\r\n", rbuf, cookie);
+    } else {
+      sprintf(fd[sock].req_header, "POST http://%s:%d/%12.10f/%d%s%s HTTP/1.0\r\n"
+                                   "Content-Length: %d\r\n"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "\r\n",
+              local_host, server_port, dr, fd[sock].response_length, evo_str, extension, fd[sock].response_length,
+              fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "",
+              // coverity[dont_call]
+              reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, cookie);
+    }
+    post_length = fd[sock].response_length;
+    break;
+  case 2:
+    if (!post_size)
+      ink_assert(!"post_size should never be zero!");
+
+    if (range_mode) {
+      sprintf(fd[sock].req_header, "POST http://%s:%d/%12.10f/%d%s%s HTTP/1.1\r\n"
+                                   "Content-Length: %d\r\n"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "\r\n",
+              local_host, server_port, dr, fd[sock].response_length, evo_str, extension, post_size,
+              fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "Connection: close\r\n",
+              // coverity[dont_call]
+              reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, "Host: localhost\r\n", rbuf, cookie);
+    } else {
+      sprintf(fd[sock].req_header, "POST http://%s:%d/%12.10f/%d%s%s HTTP/1.0\r\n"
+                                   "Content-Length: %d\r\n"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "%s"
+                                   "\r\n",
+              local_host, server_port, dr, fd[sock].response_length, evo_str, extension, post_size,
+              fd[sock].keepalive ? "Proxy-Connection: Keep-Alive\r\n" : "",
+              // coverity[dont_call]
+              reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, cookie);
+    }
+    post_length = post_size;
+    break;
   }
+
+  return post_length;
 }
 
-static void
+static int
 make_host1_request(int sock, double dr, const char *evo_str, const char *extension, const char *eheaders, const char *cookie)
 {
   sprintf(fd[sock].req_header, "GET /%12.10f/%d%s%s HTTP/1.0\r\n"
@@ -2864,9 +3049,10 @@ make_host1_request(int sock, double dr, const char *evo_str, const char *extensi
           fd[sock].keepalive ? "Connection: Keep-Alive\r\n" : "",
           // coverity[dont_call]
           reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, cookie);
+  return 0;
 }
 
-static void
+static int
 make_host2_request(int sock, double dr, const char *evo_str, const char *extension, const char *eheaders, const char *cookie)
 {
   /* Send a non-proxy client request i.e. for Transparency testing */
@@ -2879,9 +3065,10 @@ make_host2_request(int sock, double dr, const char *evo_str, const char *extensi
           dr, fd[sock].response_length, evo_str, extension, fd[sock].keepalive ? "Connection: Keep-Alive\r\n" : "",
           // coverity[dont_call]
           reload_rate > drand48() ? "Pragma: no-cache\r\n" : "", eheaders, cookie);
+  return 0;
 }
 
-static void
+static int
 build_request(int sock)
 {
   double dr, h;
@@ -2946,25 +3133,29 @@ build_request(int sock)
     sprintf(evo_str, ".%u", ((unsigned int)evo_index));
   }
 
+  int post_body = 0;
+
   switch (hostrequest) {
   case 0:
-    make_nohost_request(sock, dr, evo_str, extension, eheaders, rbuf, cookie);
+    post_body = make_nohost_request(sock, dr, evo_str, extension, eheaders, rbuf, cookie);
     break;
   case 1:
-    make_host1_request(sock, dr, evo_str, extension, eheaders, cookie);
+    post_body = make_host1_request(sock, dr, evo_str, extension, eheaders, cookie);
     break;
   case 2:
-    make_host2_request(sock, dr, evo_str, extension, eheaders, cookie);
+    post_body = make_host2_request(sock, dr, evo_str, extension, eheaders, cookie);
     break;
   default:
     ink_release_assert(!"Unexpected hostrequest! Abort.");
-    return;
+    return 0;
   }
 
   if (range_mode) {
     fd[sock].response_length = fd[sock].range_end - fd[sock].range_start + 1;
     ink_assert(fd[sock].response_length > 0);
   }
+
+  return post_body;
 }
 
 static void
@@ -2992,7 +3183,7 @@ make_bfc_client(unsigned int addr, int port)
     panic("unable to open client connection\n");
   }
 
-  build_request(sock);
+  fd[sock].post_size = build_request(sock);
 
   if (verbose) {
     printf("request %d [%s]\n", sock, fd[sock].req_header);

-- 
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>'].