Commit ee703480 authored by Jiri Hruska's avatar Jiri Hruska Committed by Steve Holme
Browse files

imap: Added custom request parsing

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.
parent 1d3ccf27
Loading
Loading
Loading
Loading
+37 −0
Original line number Original line Diff line number Diff line
@@ -87,6 +87,7 @@


/* Local API functions */
/* Local API functions */
static CURLcode imap_parse_url_path(struct connectdata *conn);
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_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode imap_do(struct connectdata *conn, bool *done);
static CURLcode imap_do(struct connectdata *conn, bool *done);
static CURLcode imap_done(struct connectdata *conn, CURLcode status,
static CURLcode imap_done(struct connectdata *conn, CURLcode status,
@@ -1806,6 +1807,11 @@ static CURLcode imap_do(struct connectdata *conn, bool *done)
  if(result)
  if(result)
    return result;
    return result;


  /* Parse the custom request */
  result = imap_parse_custom_request(conn);
  if(result)
    return result;

  result = imap_regular_transfer(conn, done);
  result = imap_regular_transfer(conn, done);


  return result;
  return result;
@@ -2017,6 +2023,37 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
  return CURLE_OK;
  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 */
/* Call this when the DO phase has completed */
static CURLcode imap_dophase_done(struct connectdata *conn, bool connected)
static CURLcode imap_dophase_done(struct connectdata *conn, bool connected)
{
{