info: send 'service unavailable' when there are too many replies in-flight
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 2 May 2016 10:03:20 +0000 (11:03 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 2 May 2016 10:04:59 +0000 (11:04 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/info/http_headers.c
lib/info/http_headers.h
lib/info/olsrd_info.c

index c376a7e..0592be6 100644 (file)
 
 #include <assert.h>
 
+void http_header_build_result(unsigned int status, struct autobuf *abuf) {
+  assert(abuf);
+
+  /* Status */
+  abuf_appendf(abuf, "%s %s\r\n", INFO_HTTP_VERSION, httpStatusToReply(status));
+
+  /* End header */
+  abuf_puts(abuf, "\r\n");
+}
+
 void http_header_build(const char *plugin_name, unsigned int status, const char *mime, struct autobuf *abuf, int *contentLengthIndex) {
   assert(plugin_name);
   assert(abuf);
index 496dfbe..e80c7af 100644 (file)
@@ -59,6 +59,8 @@
 #define INFO_HTTP_INTERNAL_SERVER_ERROR    (500)
 #define INFO_HTTP_SERVICE_UNAVAILABLE      (503)
 
+void http_header_build_result(unsigned int status, struct autobuf *abuf);
+
 void http_header_build(const char * plugin_name, unsigned int status, const char *mime, struct autobuf *abuf, int *contentLengthIndex);
 
 void http_header_adjust_content_length(struct autobuf *abuf, int contentLengthIndex, int contentLength);
index b9f7ad4..4bb3944 100644 (file)
@@ -304,6 +304,27 @@ static unsigned int determine_action(char *requ) {
   }
 }
 
+static void send_status_no_retries(const char * req, int the_socket, unsigned int status) {
+  struct autobuf abuf;
+
+  abuf_init(&abuf, AUTOBUFCHUNK);
+
+  if (config->http_headers) {
+    http_header_build_result(status, &abuf);
+  } else 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");
+    }
+  }
+
+  (void) send(the_socket, abuf.buf, abuf.len, 0);
+  close(the_socket);
+  abuf_free(&abuf);
+}
+
 static void write_data(void *unused __attribute__((unused))) {
   fd_set set;
   int result, i, max;
@@ -670,7 +691,7 @@ static void ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int
 
   if (outbuffer.count >= MAX_CLIENTS) {
     /* limit the number of replies that are in-flight */
-    close(ipc_connection);
+    send_status_no_retries(req, ipc_connection, INFO_HTTP_SERVICE_UNAVAILABLE);
     return;
   }