traeak commented on code in PR #13843:
URL: https://github.com/apache/trafficserver/pull/13843#discussion_r4288073488


##########
plugins/stats_over_http/stats_over_http.cc:
##########
@@ -298,116 +223,77 @@ stats_process_accept(TSCont contp, stats_state *my_state)
   my_state->read_vio    = TSVConnRead(my_state->net_vc, contp, 
my_state->req_buffer, INT64_MAX);
 }
 
-static int64_t
-stats_add_data_to_resp_buffer(const char *s, stats_state *my_state)
+static void
+stats_append(const char *s, stats_state *my_state)
 {
-  if (s == nullptr) {
-    return 0;
+  if (s != nullptr) {
+    my_state->body.append(s);
   }
-  int64_t s_len = strlen(s);
-
-  int64_t bytes_written = TSIOBufferWrite(my_state->resp_buffer, s, s_len);
-  if (bytes_written == TS_ERROR) {
-    return 0;
-  }
-
-  return bytes_written;
 }
 
-static const char RESP_HEADER_JSON[] = "HTTP/1.0 200 OK\r\nContent-Type: 
text/json\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_JSON_GZIP[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/json\r\nContent-Encoding: 
gzip\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_JSON_DEFLATE[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/json\r\nContent-Encoding: 
deflate\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_JSON_BR[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/json\r\nContent-Encoding: 
br\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_CSV[] = "HTTP/1.0 200 OK\r\nContent-Type: 
text/csv\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_CSV_GZIP[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/csv\r\nContent-Encoding: 
gzip\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_CSV_DEFLATE[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/csv\r\nContent-Encoding: 
deflate\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_CSV_BR[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/csv\r\nContent-Encoding: 
br\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/plain; version=0.0.4; 
charset=utf-8\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_GZIP[] = "HTTP/1.0 200 
OK\r\nContent-Type: text/plain; version=0.0.4; "
-                                                  
"charset=utf-8\r\nContent-Encoding: gzip\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_DEFLATE[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/plain; version=0.0.4; 
charset=utf-8\r\nContent-Encoding: deflate\r\nCache-Control: "
-  "no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_BR[] = "HTTP/1.0 200 
OK\r\nContent-Type: text/plain; version=0.0.4; "
-                                                
"charset=utf-8\r\nContent-Encoding: br\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_V2[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/plain; version=2.0.0; 
charset=utf-8\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_V2_GZIP[] = "HTTP/1.0 200 
OK\r\nContent-Type: text/plain; version=2.0.0; "
-                                                     
"charset=utf-8\r\nContent-Encoding: gzip\r\nCache-Control: no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_V2_DEFLATE[] =
-  "HTTP/1.0 200 OK\r\nContent-Type: text/plain; version=2.0.0; 
charset=utf-8\r\nContent-Encoding: deflate\r\nCache-Control: "
-  "no-cache\r\n\r\n";
-static const char RESP_HEADER_PROMETHEUS_V2_BR[] = "HTTP/1.0 200 
OK\r\nContent-Type: text/plain; version=2.0.0; "
-                                                   
"charset=utf-8\r\nContent-Encoding: br\r\nCache-Control: no-cache\r\n\r\n";
-
-static int64_t
-stats_add_resp_header(stats_state *my_state)
+static std::string
+build_resp_header(output_format_t format, const cached_body &entry)
 {
-  switch (my_state->output_format) {
-  case output_format_t::JSON_OUTPUT:
-    if (my_state->encoding == encoding_format_t::GZIP) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_JSON_GZIP, my_state);
-    } else if (my_state->encoding == encoding_format_t::DEFLATE) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_JSON_DEFLATE, my_state);
-    } else if (my_state->encoding == encoding_format_t::BR) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_JSON_BR, my_state);
-    } else {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_JSON, my_state);
-    }
-    break;
+  std::string header{"HTTP/1.0 200 OK\r\nContent-Type: "};
+
+  switch (format) {
   case output_format_t::CSV_OUTPUT:
-    if (my_state->encoding == encoding_format_t::GZIP) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_CSV_GZIP, my_state);
-    } else if (my_state->encoding == encoding_format_t::DEFLATE) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_CSV_DEFLATE, my_state);
-    } else if (my_state->encoding == encoding_format_t::BR) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_CSV_BR, my_state);
-    } else {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_CSV, my_state);
-    }
+    header += "text/csv";
     break;
   case output_format_t::PROMETHEUS_OUTPUT:
-    if (my_state->encoding == encoding_format_t::GZIP) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_GZIP, 
my_state);
-    } else if (my_state->encoding == encoding_format_t::DEFLATE) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_DEFLATE, 
my_state);
-    } else if (my_state->encoding == encoding_format_t::BR) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_BR, 
my_state);
-    } else {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS, my_state);
-    }
+    header += "text/plain; version=0.0.4; charset=utf-8";
     break;
   case output_format_t::PROMETHEUS_V2_OUTPUT:
-    if (my_state->encoding == encoding_format_t::GZIP) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_V2_GZIP, 
my_state);
-    } else if (my_state->encoding == encoding_format_t::DEFLATE) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_V2_DEFLATE, 
my_state);
-    } else if (my_state->encoding == encoding_format_t::BR) {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_V2_BR, 
my_state);
-    } else {
-      return stats_add_data_to_resp_buffer(RESP_HEADER_PROMETHEUS_V2, 
my_state);
-    }
+    header += "text/plain; version=2.0.0; charset=utf-8";
+    break;
+  default:
+    header += "text/json";
     break;
   }
-  // Not reached.
-  return stats_add_data_to_resp_buffer(RESP_HEADER_JSON, my_state);
+  header += "\r\n";
+
+  switch (entry.encoding) {
+  case encoding_format_t::GZIP:
+    header += "Content-Encoding: gzip\r\n";
+    break;
+  case encoding_format_t::DEFLATE:
+    header += "Content-Encoding: deflate\r\n";
+    break;
+  case encoding_format_t::BR:
+    header += "Content-Encoding: br\r\n";
+    break;
+  default:
+    break;
+  }
+
+  if (cache_ttl.count() > 0) {
+    auto age = 
std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now()
 - entry.generated);
+
+    header += "Cache-Control: max-age=" + std::to_string(cache_ttl.count()) + 
"\r\n";
+    header += "Age: " + std::to_string(age.count()) + "\r\n";
+    header += "Vary: Accept, Accept-Encoding\r\n";
+  } else {
+    header += "Cache-Control: no-cache\r\n";
+  }
+  header += "\r\n";
+
+  return header;
 }
 
+static std::shared_ptr<const cached_body> get_body(stats_state *my_state);
+
 static void
 stats_process_read(TSCont contp, TSEvent event, stats_state *my_state)
 {
   Dbg(dbg_ctl, "stats_process_read(%d)", event);
   if (event == TS_EVENT_VCONN_READ_READY) {
-    my_state->output_bytes = stats_add_resp_header(my_state);
+    auto        entry  = get_body(my_state);
+    std::string header = build_resp_header(my_state->output_format, *entry);
+    int64_t     nbytes = TSIOBufferWrite(my_state->resp_buffer, header.data(), 
header.size());
+
+    nbytes += TSIOBufferWrite(my_state->resp_buffer, entry->body.data(), 
entry->body.size());

Review Comment:
   TSIOBufferWrite returns whatever MIOBuffer::write returns and never returns 
TS_ERROR.  Will address.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to