[monitoring-plugins] page length is computed from header, fallback to ...

Andreas Baumann git at monitoring-plugins.org
Thu Apr 27 15:00:13 CEST 2017


 Module: monitoring-plugins
 Branch: feature_check_curl
 Commit: 4df31dbe62b873a94282723463f8a5588bb3dfb9
 Author: Andreas Baumann <mail at andreasbaumann.cc>
   Date: Thu Apr 27 14:50:20 2017 +0200
    URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=4df31db

page length is computed from header, fallback to actual body size (get_content_length)

---

 plugins/check_curl.c | 42 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/plugins/check_curl.c b/plugins/check_curl.c
index cd00b0e..babbcd5 100644
--- a/plugins/check_curl.c
+++ b/plugins/check_curl.c
@@ -168,11 +168,9 @@ char *client_cert = NULL;
 char *client_privkey = NULL;
 char *ca_cert = NULL;
 int is_openssl_callback = FALSE;
-#ifdef HAVE_SSL
-#ifdef USE_OPENSSL
+#if defined(HAVE_SSL) && defined(USE_OPENSSL)
 X509 *cert = NULL;
-#endif /* USE_OPENSSL */
-#endif /* HAVE_SSL */
+#endif /* defined(HAVE_SSL) && defined(USE_OPENSSL) */
 int no_body = FALSE;
 int maximum_age = -1;
 int address_family = AF_UNSPEC;
@@ -199,6 +197,11 @@ void curlhelp_free_statusline (curlhelp_statusline *);
 char *perfd_time_ssl (double microsec);
 char *get_header_value (const struct phr_header* headers, const size_t nof_headers, const char* header);
 int check_document_dates (const curlhelp_write_curlbuf *, char (*msg)[DEFAULT_BUFFER_SIZE]);
+int get_content_length (const curlhelp_write_curlbuf* header_buf, const curlhelp_write_curlbuf* body_buf);
+
+#if defined(HAVE_SSL) && defined(USE_OPENSSL)
+int np_net_ssl_check_certificate(X509 *certificate, int days_till_exp_warn, int days_till_exp_crit);
+#endif /* defined(HAVE_SSL) && defined(USE_OPENSSL) */
 
 void remove_newlines (char *);
 void test_file (char *);
@@ -756,7 +759,7 @@ GOT_FIRST_CERT:
    * - if -N (nobody) is given, use Content-Length only and hope the server set
    *   the value correcly
    */
-  page_len = header_buf.buflen + body_buf.buflen;
+  page_len = get_content_length(&header_buf, &body_buf);
   if ((max_page_len > 0) && (page_len > max_page_len)) {
     snprintf (msg, DEFAULT_BUFFER_SIZE, _("%spage size %d too large, "), msg, page_len);
     result = max_state_alt(STATE_WARNING, result);
@@ -1698,6 +1701,35 @@ check_document_dates (const curlhelp_write_curlbuf *header_buf, char (*msg)[DEFA
   return date_result;
 }
 
+int
+get_content_length (const curlhelp_write_curlbuf* header_buf, const curlhelp_write_curlbuf* body_buf)
+{
+  const char *s;
+  int content_length = 0;
+  char *copy;
+  struct phr_header headers[255];
+  size_t nof_headers = 255;
+  size_t msglen;
+  char *content_length_s = NULL;
+  curlhelp_statusline status_line;
+
+  int res = phr_parse_response (header_buf->buf, header_buf->buflen,
+    &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
+    headers, &nof_headers, 0);
+  
+  content_length_s = get_header_value (headers, nof_headers, "content-length");
+  if (!content_length_s) {
+    /* TODO: or header_buf->buflen + body_buf->buflen */
+    return body_buf->buflen;
+  }
+  /* TODO: trim */
+  content_length = atoi (content_length_s);
+
+  if (content_length_s) free (content_length_s);
+
+  return content_length;
+}
+
 /* TODO: is there a better way in libcurl to check for the SSL library? */
 curlhelp_ssl_library
 curlhelp_get_ssl_library (CURL* curl)



More information about the Commits mailing list