info: introduce command prefixes '/http' and '/plain'
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 2 Jan 2017 13:06:22 +0000 (14:06 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 4 Jan 2017 08:47:10 +0000 (09:47 +0100)
All info plugins support a number of request prefixes:
- /http : forces output WITH    http headers, temporarily overriding the
          configured "httpheaders" value.
- /plain: forces output WITHOUT http headers, temporarily overriding the
          configured "httpheaders" value.

These prefixes have to be at the start of the request string, can occur
only there, and can occur only once.

Note that this will NOT work when there is an internal error (only occurs
when the connection is not ready to be read, which is very unlikely).

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/info/README_INFO
lib/info/info_types.h
lib/info/olsrd_info.c

index 783d8cf..77d0672 100644 (file)
@@ -38,6 +38,23 @@ assumed.
 Check the README of the actual info plugin to see the supported commands.
 
 
+================
+REQUEST PREFIXES
+================
+
+All info plugins support a number of request prefixes:
+- /http : forces output WITH    http headers, temporarily overriding the
+          configured "httpheaders" value.
+- /plain: forces output WITHOUT http headers, temporarily overriding the
+          configured "httpheaders" value.
+
+These prefixes have to be at the start of the request string, can occur
+only there, and can occur only once.
+
+Note that this will NOT work when there is an internal error (only occurs
+when the connection is not ready to be read, which is very unlikely).
+
+
 ====================
 PLUGIN CONFIGURATION
 ====================
index aae8f9d..43f9f85 100644 (file)
@@ -111,6 +111,12 @@ typedef struct {
 /* everything */
 #define SIW_EVERYTHING                   ((SIW_NETJSON_NETWORK_COLLECTION << 1) - 1)
 
+/* command prefixes */
+#define SIW_PREFIX_HTTP                  "/http"
+#define SIW_PREFIX_HTTP_LEN              (sizeof(SIW_PREFIX_HTTP) - 1)
+#define SIW_PREFIX_PLAIN                 "/plain"
+#define SIW_PREFIX_PLAIN_LEN             (sizeof(SIW_PREFIX_PLAIN) - 1)
+
 typedef void (*init_plugin)(const char *plugin_name);
 typedef unsigned long long (*supported_commands_mask_func)(void);
 typedef bool (*command_matcher)(const char *str, unsigned long long siw);
index 91fd72d..de66a70 100644 (file)
@@ -663,6 +663,56 @@ static char * parseRequest(char * req, size_t *len) {
   return req;
 }
 
+static char * checkCommandPrefixes(char * req, size_t *len, bool *add_headers) {
+  size_t l;
+
+  if (!req || !len || !*len || !add_headers) {
+    return req;
+  }
+
+  l = *len;
+
+  /* '/http/...' */
+
+  if ((l >= (SIW_PREFIX_HTTP_LEN + 1)) && !strncasecmp(req, SIW_PREFIX_HTTP "/", SIW_PREFIX_HTTP_LEN + 1)) {
+    *len = l - SIW_PREFIX_HTTP_LEN;
+    req = &req[SIW_PREFIX_HTTP_LEN];
+    *add_headers = true;
+    return req;
+  }
+
+  /* '/http' */
+
+  if ((l == SIW_PREFIX_HTTP_LEN) && !strcasecmp(req, SIW_PREFIX_HTTP)) {
+    *len = 0;
+    *req = '\0';
+    *add_headers = true;
+    return req;
+  }
+
+  /* '/plain/...' */
+
+  if ((l >= (SIW_PREFIX_PLAIN_LEN + 1)) && !strncasecmp(req, SIW_PREFIX_PLAIN "/", SIW_PREFIX_PLAIN_LEN + 1)) {
+    *len = l - SIW_PREFIX_PLAIN_LEN;
+    req = &req[SIW_PREFIX_PLAIN_LEN];
+    *add_headers = false;
+    return req;
+  }
+
+  /* '/plain' */
+
+  if ((l == SIW_PREFIX_PLAIN_LEN) && !strcasecmp(req, SIW_PREFIX_PLAIN)) {
+    *len = 0;
+    *req = '\0';
+    *add_headers = false;
+    return req;
+  }
+
+  /* no prefixes */
+
+  return req;
+}
+
 static void drain_request(int ipc_connection) {
   static char drain_buffer[AUTOBUFCHUNK];
 
@@ -763,6 +813,10 @@ static void ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int
     req = stripTrailingSlashes(req, (size_t*) &rx_count);
     req = skipLeadingWhitespace(req, (size_t*) &rx_count);
     req = skipMultipleSlashes(req, (size_t*) &rx_count);
+
+    req = checkCommandPrefixes(req, (size_t*) &rx_count, &add_headers);
+
+    req = skipMultipleSlashes(req, (size_t*) &rx_count);
   }
 
   if (outbuffer.count >= MAX_CLIENTS) {