info: respond with "no content" (204) on empty output
authorFerry Huberts <ferry.huberts@pelagic.nl>
Sun, 21 Feb 2016 16:20:22 +0000 (17:20 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 25 Feb 2016 12:39:16 +0000 (13:39 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/info/http_headers.h
lib/info/olsrd_info.c
lib/jsoninfo/src/olsrd_jsoninfo.c
lib/txtinfo/src/olsrd_txtinfo.c

index 2a54031..beabf98 100644 (file)
@@ -48,6 +48,7 @@
 
 /* Response types */
 #define INFO_HTTP_OK             (200)
+#define INFO_HTTP_NOCONTENT      (204)
 #define INFO_HTTP_NOTFOUND       (404)
 
 void http_header_build(const char * plugin_name, unsigned int status, const char *mime, struct autobuf *abuf, int *contentLengthIndex);
@@ -56,6 +57,9 @@ void http_header_adjust_content_length(struct autobuf *abuf, int contentLengthIn
 
 static INLINE const char * httpStatusToReply(unsigned int status) {
   switch (status) {
+    case INFO_HTTP_NOCONTENT:
+      return INFO_HTTP_VERSION " 204 No Content";
+
     case INFO_HTTP_NOTFOUND:
       return INFO_HTTP_VERSION " 404 Not Found";
 
index acb728a..862368c 100644 (file)
@@ -189,6 +189,7 @@ static void write_data(void *foo __attribute__ ((unused))) {
 
 static void send_info(const char * req, unsigned int send_what, int the_socket, unsigned int status) {
   struct autobuf abuf;
+  unsigned int outputLength = 0;
 
   const char *content_type = functions->determine_mime_type ? functions->determine_mime_type(send_what) : "text/plain; charset=utf-8";
   int contentLengthIndex = 0;
@@ -229,11 +230,14 @@ static void send_info(const char * req, unsigned int send_what, int the_socket,
         };
 
       unsigned int i;
+      unsigned int preLength;
 
       if (functions->output_start) {
         functions->output_start(&abuf);
       }
 
+      preLength = abuf.len;
+
       for (i = 0; i < ARRAY_SIZE(funcs); i++) {
         if (send_what & funcs[i].siw) {
           printer_generic func = funcs[i].func;
@@ -243,23 +247,35 @@ static void send_info(const char * req, unsigned int send_what, int the_socket,
         }
       }
 
+      outputLength = abuf.len - preLength;
+
       if (functions->output_end) {
         functions->output_end(&abuf);
       }
     } else if ((send_what & SIW_OLSRD_CONF) && functions->olsrd_conf) {
       /* this outputs the olsrd.conf text directly, not normal format */
+      unsigned int preLength = abuf.len;
       functions->olsrd_conf(&abuf);
+      outputLength = abuf.len - preLength;
     }
 
-    if (!abuf.len) {
-      /* wget can't handle output of zero length */
-      abuf_puts(&abuf, "\n");
+    if (!abuf.len || !outputLength) {
+      status = INFO_HTTP_NOCONTENT;
+      abuf.buf[0] = '\0';
+      abuf.len = 0;
+      if (config->http_headers) {
+        http_header_build(name, status, content_type, &abuf, &contentLengthIndex);
+        headerLength = abuf.len;
+      }
     }
   }
 
   if (status != INFO_HTTP_OK) {
     if (functions->output_error) {
       functions->output_error(&abuf, status, req, config->http_headers);
+    } else if (status == INFO_HTTP_NOCONTENT) {
+      /* wget can't handle output of zero length */
+      abuf_puts(&abuf, "\n");
     }
   }
 
index 0e4d1f1..8aae4ca 100644 (file)
@@ -190,6 +190,10 @@ void output_error(struct autobuf *abuf, unsigned int status, const char * req, b
       abuf_json_string(abuf, "error", buf);
       break;
 
+    case INFO_HTTP_NOCONTENT:
+      abuf_json_string(abuf, "error", "no content");
+      break;
+
     default:
       break;
   }
index a62ad88..4b28265 100644 (file)
@@ -192,6 +192,11 @@ void output_error(struct autobuf *abuf, unsigned int status, const char * req, b
       abuf_appendf(abuf, "error: Invalid request '%s'\n", req);
       break;
 
+    case INFO_HTTP_NOCONTENT:
+      /* wget can't handle output of zero length */
+      abuf_puts(abuf, "\n");
+      break;
+
     case INFO_HTTP_OK:
     default:
       return;