imap: Added custom request parsing
authorJiri Hruska <jirka@fud.cz>
Sun, 3 Mar 2013 09:49:37 +0000 (10:49 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Sun, 3 Mar 2013 11:06:55 +0000 (11:06 +0000)
Added imap_parse_custom_request() for parsing the CURLOPT_CUSTOMREQUEST
parameter which URL decodes the value and separates the request from
any parameters - This makes it easier to filter untagged responses
by the request command.

lib/imap.c

index 3a1d135..69ec352 100644 (file)
@@ -87,6 +87,7 @@
 
 /* Local API functions */
 static CURLcode imap_parse_url_path(struct connectdata *conn);
+static CURLcode imap_parse_custom_request(struct connectdata *conn);
 static CURLcode imap_regular_transfer(struct connectdata *conn, bool *done);
 static CURLcode imap_do(struct connectdata *conn, bool *done);
 static CURLcode imap_done(struct connectdata *conn, CURLcode status,
@@ -1806,6 +1807,11 @@ static CURLcode imap_do(struct connectdata *conn, bool *done)
   if(result)
     return result;
 
+  /* Parse the custom request */
+  result = imap_parse_custom_request(conn);
+  if(result)
+    return result;
+
   result = imap_regular_transfer(conn, done);
 
   return result;
@@ -2017,6 +2023,37 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
   return CURLE_OK;
 }
 
+static CURLcode imap_parse_custom_request(struct connectdata *conn)
+{
+  CURLcode result = CURLE_OK;
+  struct SessionHandle *data = conn->data;
+  struct IMAP *imap = data->state.proto.imap;
+  const char *custom = data->set.str[STRING_CUSTOMREQUEST];
+
+  if(custom) {
+    /* URL decode the custom request */
+    result = Curl_urldecode(data, custom, 0, &imap->custom, NULL, TRUE);
+
+    /* Extract the parameters if specified */
+    if(!result) {
+      const char *params = imap->custom;
+
+      while(*params && *params != ' ')
+        params++;
+
+      if(*params) {
+        imap->custom_params = strdup(params);
+        imap->custom[params - imap->custom] = '\0';
+
+        if(!imap->custom_params)
+          result = CURLE_OUT_OF_MEMORY;
+      }
+    }
+  }
+
+  return result;
+}
+
 /* Call this when the DO phase has completed */
 static CURLcode imap_dophase_done(struct connectdata *conn, bool connected)
 {