summaryrefslogtreecommitdiff
path: root/lib/imap.c
diff options
context:
space:
mode:
authorSteve Holme <steve_holme@hotmail.com>2014-04-18 15:58:33 +0100
committerSteve Holme <steve_holme@hotmail.com>2014-04-18 16:43:57 +0100
commitca63d4feba34b5c48bd75e62fd6cd05f5bf61046 (patch)
treef6bfb211b263343bd33680dc39faa9a67926ddfa /lib/imap.c
parentf804378d16bba22bc22afebb6ffe1858cfd9edf6 (diff)
downloadcurl-ca63d4feba34b5c48bd75e62fd6cd05f5bf61046.tar.gz
imap: Added support for parsing URL query strings
Added support for parsing query strings from the URL as defined by RFC-5092.
Diffstat (limited to 'lib/imap.c')
-rw-r--r--lib/imap.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/imap.c b/lib/imap.c
index 5e2e670da..dd98b3fd9 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -131,8 +131,7 @@ const struct Curl_handler Curl_handler_imap = {
ZERO_NULL, /* readwrite */
PORT_IMAP, /* defport */
CURLPROTO_IMAP, /* protocol */
- PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD
- | PROTOPT_NOURLQUERY /* flags */
+ PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD /* flags */
};
#ifdef USE_SSL
@@ -157,8 +156,8 @@ const struct Curl_handler Curl_handler_imaps = {
ZERO_NULL, /* readwrite */
PORT_IMAPS, /* defport */
CURLPROTO_IMAP | CURLPROTO_IMAPS, /* protocol */
- PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NEEDSPWD
- | PROTOPT_NOURLQUERY /* flags */
+ PROTOPT_CLOSEACTION | PROTOPT_SSL |
+ PROTOPT_NEEDSPWD /* flags */
};
#endif
@@ -1902,6 +1901,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
Curl_safefree(imap->uidvalidity);
Curl_safefree(imap->uid);
Curl_safefree(imap->section);
+ Curl_safefree(imap->query);
Curl_safefree(imap->custom);
Curl_safefree(imap->custom_params);
@@ -2476,6 +2476,21 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
Curl_safefree(value);
}
+ /* Does the URL contain a query parameter? Only valid when we have a mailbox
+ and no UID as per RFC-5092 */
+ if(imap->mailbox && !imap->uid && *ptr == '?') {
+ /* Find the length of the query parameter */
+ begin = ++ptr;
+ while(imap_is_bchar(*ptr))
+ ptr++;
+
+ /* Decode the query parameter */
+ result = Curl_urldecode(data, begin, ptr - begin, &imap->query, NULL,
+ TRUE);
+ if(result)
+ return result;
+ }
+
/* Any extra stuff at the end of the URL is an error */
if(*ptr)
return CURLE_URL_MALFORMAT;