You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/12/08 22:40:59 UTC

svn commit: r1043691 - /trafficserver/traffic/trunk/proxy/logstats.cc

Author: zwoop
Date: Wed Dec  8 21:40:58 2010
New Revision: 1043691

URL: http://svn.apache.org/viewvc?rev=1043691&view=rev
Log:
TS-587 More query options, better "parser".

Modified:
    trafficserver/traffic/trunk/proxy/logstats.cc

Modified: trafficserver/traffic/trunk/proxy/logstats.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/logstats.cc?rev=1043691&r1=1043690&r2=1043691&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/logstats.cc (original)
+++ trafficserver/traffic/trunk/proxy/logstats.cc Wed Dec  8 21:40:58 2010
@@ -73,6 +73,7 @@ using namespace std;
 const int MAX_LOGBUFFER_SIZE = 65536;
 const int DEFAULT_LINE_LEN = 78;
 const double LOG10_1024 = 3.0102999566398116;
+const int MAX_ORIG_STRING = 4096;
 
 
 // Optimizations for "strcmp()", treat some fixed length (3 or 4 bytes) strings
@@ -343,7 +344,7 @@ static struct
 {
   char log_file[1024];
   char origin_file[1024];
-  char origin_list[2048];
+  char origin_list[MAX_ORIG_STRING];
   int max_origins;
   char state_tag[1024];
   int64 min_hits;
@@ -361,7 +362,7 @@ static struct
 ArgumentDescription argument_descriptions[] = {
   {"help", 'h', "Give this help", "T", &cl.help, NULL, NULL},
   {"log_file", 'f', "Specific logfile to parse", "S1023", cl.log_file, NULL, NULL},
-  {"origin_list", 'o', "Only show stats for listed Origins", "S2047", cl.origin_list, NULL, NULL},
+  {"origin_list", 'o', "Only show stats for listed Origins", "S4095", cl.origin_list, NULL, NULL},
   {"origin_file", 'O', "File listing Origins to show", "S1023", cl.origin_file, NULL, NULL},
   {"max_orgins", 'M', "Max number of Origins to show", "I", &cl.max_origins, NULL, NULL},
   {"incremental", 'i', "Incremental log parsing", "T", &cl.incremental, NULL, NULL},
@@ -961,7 +962,6 @@ parse_log_buff(LogBufferHeader * buf_hea
       case P_STATE_URL:
         state = P_STATE_RFC931;
 
-        //printf("URL == %s\n", tok);
         // TODO check for read_from being empty string
         if (flag == 0) {
           tok = read_from;
@@ -982,17 +982,15 @@ parse_log_buff(LogBufferHeader * buf_hea
               scheme = SCHEME_NONE;
             tok_len = strlen(tok);
           }
-          //printf("SCHEME = %d\n", scheme);
           if (*tok == '/')      // This is to handle crazy stuff like http:///origin.com
             tok++;
           ptr = strchr(tok, '/');
           if (ptr && !summary) { // Find the origin
             *ptr = '\0';
 
-            // TODO: If we save state (struct) for a run, we might need to always
+            // TODO: If we save state (struct) for a run, we probably need to always
             // update the origin data, no matter what the origin_set is.
             if (origin_set ? (origin_set->find(tok) != origin_set->end()) : 1) {
-              //printf("ORIGIN = %s\n", tok);
               o_iter = origins.find(tok);
               if (o_iter == origins.end()) {
                 o_stats = (OriginStats *) xmalloc(sizeof(OriginStats));
@@ -1732,7 +1730,7 @@ my_exit(ExitLevel status, const char *no
   }
 
   if (cl.json) {
-    // TODO: Add JSON output
+    // TODO: Add JSON output?
   } else {
     switch (status) {
     case EXIT_OK:
@@ -1899,28 +1897,38 @@ main(int argc, char *argv[])
   // Process as "CGI" ?
   if (strstr(argv[0], ".cgi") || cl.cgi) {
     char *query;
-    char *pos1, *pos2;
     int len;
 
     cl.json = 1;
     cl.cgi = 1;
 
-    query = getenv("QUERY_STRING");
-    if (query) {
-      char buffer[2048];
+    if (NULL != (query = getenv("QUERY_STRING"))) {
+      char buffer[MAX_ORIG_STRING];
+      char *tok, *sep_ptr, *val;
 
-      ink_strncpy(buffer, query, sizeof(buffer));
-      buffer[2047] = '\0';
+      ink_strncpy(buffer, query, MAX_ORIG_STRING);
+      buffer[MAX_ORIG_STRING-1] = '\0';
       len = unescapifyStr(buffer);
-      if (NULL != (pos1 = strstr(buffer, "origin_list="))) {
-        pos1 += 12;
-        if (NULL == (pos2 = strchr(pos1, '&')))
-          pos2 = buffer + len;
-        strncpy(cl.origin_list, pos1, (pos2 - pos1));
-      }
-      if (NULL != (pos1 = strstr(buffer, "max_origins="))) {
-        pos1 += 12;
-        cl.max_origins = strtol(pos1, NULL, 10); // Up until EOS or non-numeric
+
+      for (tok = strtok_r(buffer, "&", &sep_ptr); tok != NULL;) {
+        val = strchr(tok, '=');
+        if (val)
+          *(val++) = '\0';
+        if (0 == strncmp(tok, "origin_list", 11)) {
+          ink_strncpy(cl.origin_list, val, MAX_ORIG_STRING-1);
+        } else if (0 == strncmp(tok, "state_tag", 9)) {
+          ink_strncpy(cl.state_tag, val, 1023);
+        } else if (0 == strncmp(tok, "max_origins", 11)) {
+          cl.max_origins = strtol(val, NULL, 10);
+        } else if (0 == strncmp(tok, "min_hits", 8)) {
+          cl.min_hits = strtol(val, NULL, 10);
+        } else if (0 == strncmp(tok, "incremental", 11)) {
+          cl.incremental = strtol(val, NULL, 10);
+        } else {
+          // Unknown query arg.
+        }
+
+        tok = strtok_r(NULL, "&", &sep_ptr);
       }
     }
   }