aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/imap.c286
1 files changed, 143 insertions, 143 deletions
diff --git a/lib/imap.c b/lib/imap.c
index 65997b976..401779916 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -86,8 +86,6 @@
#include "memdebug.h"
/* 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,
@@ -101,6 +99,8 @@ static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode imap_setup_connection(struct connectdata *conn);
static char *imap_atom(const char *str);
static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...);
+static CURLcode imap_parse_url_path(struct connectdata *conn);
+static CURLcode imap_parse_custom_request(struct connectdata *conn);
/*
* IMAP protocol handler.
@@ -1973,147 +1973,6 @@ static bool imap_is_bchar(char ch)
}
}
-/***********************************************************************
- *
- * imap_parse_url_path()
- *
- * Parse the URL path into separate path components.
- *
- */
-static CURLcode imap_parse_url_path(struct connectdata *conn)
-{
- /* The imap struct is already initialised in imap_connect() */
- CURLcode result = CURLE_OK;
- struct SessionHandle *data = conn->data;
- struct IMAP *imap = data->state.proto.imap;
- const char *begin = data->state.path;
- const char *ptr = begin;
-
- /* See how much of the URL is a valid path and decode it */
- while(imap_is_bchar(*ptr))
- ptr++;
-
- if(ptr != begin) {
- /* Remove the trailing slash if present */
- const char *end = ptr;
- if(end > begin && end[-1] == '/')
- end--;
-
- result = Curl_urldecode(data, begin, end - begin, &imap->mailbox, NULL,
- TRUE);
- if(result)
- return result;
- }
- else
- imap->mailbox = NULL;
-
- /* There can be any number of parameters in the form ";NAME=VALUE" */
- while(*ptr == ';') {
- char *name;
- char *value;
- size_t valuelen;
-
- /* Find the length of the name parameter */
- begin = ++ptr;
- while(*ptr && *ptr != '=')
- ptr++;
-
- if(!*ptr)
- return CURLE_URL_MALFORMAT;
-
- /* Decode the name parameter */
- result = Curl_urldecode(data, begin, ptr - begin, &name, NULL, TRUE);
- if(result)
- return result;
-
- /* Find the length of the value parameter */
- begin = ++ptr;
- while(imap_is_bchar(*ptr))
- ptr++;
-
- /* Decode the value parameter */
- result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen, TRUE);
- if(result) {
- Curl_safefree(name);
- return result;
- }
-
- DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value));
-
- /* Process the known hierarchical parameters (UIDVALIDITY, UID and SECTION)
- stripping of the trailing slash character if it is present.
-
- Note: Unknown parameters trigger a URL_MALFORMAT error. */
- if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) {
- if(valuelen > 0 && value[valuelen - 1] == '/')
- value[valuelen - 1] = '\0';
-
- imap->uidvalidity = value;
- value = NULL;
- }
- else if(Curl_raw_equal(name, "UID") && !imap->uid) {
- if(valuelen > 0 && value[valuelen - 1] == '/')
- value[valuelen - 1] = '\0';
-
- imap->uid = value;
- value = NULL;
- }
- else if(Curl_raw_equal(name, "SECTION") && !imap->section) {
- if(valuelen > 0 && value[valuelen - 1] == '/')
- value[valuelen - 1] = '\0';
-
- imap->section = value;
- value = NULL;
- }
- else {
- Curl_safefree(name);
- Curl_safefree(value);
-
- return CURLE_URL_MALFORMAT;
- }
-
- Curl_safefree(name);
- Curl_safefree(value);
- }
-
- /* Any extra stuff at the end of the URL is an error */
- if(*ptr)
- return CURLE_URL_MALFORMAT;
-
- 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)
{
@@ -2326,4 +2185,145 @@ static char *imap_atom(const char *str)
return newstr;
}
+/***********************************************************************
+ *
+ * imap_parse_url_path()
+ *
+ * Parse the URL path into separate path components.
+ *
+ */
+static CURLcode imap_parse_url_path(struct connectdata *conn)
+{
+ /* The imap struct is already initialised in imap_connect() */
+ CURLcode result = CURLE_OK;
+ struct SessionHandle *data = conn->data;
+ struct IMAP *imap = data->state.proto.imap;
+ const char *begin = data->state.path;
+ const char *ptr = begin;
+
+ /* See how much of the URL is a valid path and decode it */
+ while(imap_is_bchar(*ptr))
+ ptr++;
+
+ if(ptr != begin) {
+ /* Remove the trailing slash if present */
+ const char *end = ptr;
+ if(end > begin && end[-1] == '/')
+ end--;
+
+ result = Curl_urldecode(data, begin, end - begin, &imap->mailbox, NULL,
+ TRUE);
+ if(result)
+ return result;
+ }
+ else
+ imap->mailbox = NULL;
+
+ /* There can be any number of parameters in the form ";NAME=VALUE" */
+ while(*ptr == ';') {
+ char *name;
+ char *value;
+ size_t valuelen;
+
+ /* Find the length of the name parameter */
+ begin = ++ptr;
+ while(*ptr && *ptr != '=')
+ ptr++;
+
+ if(!*ptr)
+ return CURLE_URL_MALFORMAT;
+
+ /* Decode the name parameter */
+ result = Curl_urldecode(data, begin, ptr - begin, &name, NULL, TRUE);
+ if(result)
+ return result;
+
+ /* Find the length of the value parameter */
+ begin = ++ptr;
+ while(imap_is_bchar(*ptr))
+ ptr++;
+
+ /* Decode the value parameter */
+ result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen, TRUE);
+ if(result) {
+ Curl_safefree(name);
+ return result;
+ }
+
+ DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value));
+
+ /* Process the known hierarchical parameters (UIDVALIDITY, UID and SECTION)
+ stripping of the trailing slash character if it is present.
+
+ Note: Unknown parameters trigger a URL_MALFORMAT error. */
+ if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) {
+ if(valuelen > 0 && value[valuelen - 1] == '/')
+ value[valuelen - 1] = '\0';
+
+ imap->uidvalidity = value;
+ value = NULL;
+ }
+ else if(Curl_raw_equal(name, "UID") && !imap->uid) {
+ if(valuelen > 0 && value[valuelen - 1] == '/')
+ value[valuelen - 1] = '\0';
+
+ imap->uid = value;
+ value = NULL;
+ }
+ else if(Curl_raw_equal(name, "SECTION") && !imap->section) {
+ if(valuelen > 0 && value[valuelen - 1] == '/')
+ value[valuelen - 1] = '\0';
+
+ imap->section = value;
+ value = NULL;
+ }
+ else {
+ Curl_safefree(name);
+ Curl_safefree(value);
+
+ return CURLE_URL_MALFORMAT;
+ }
+
+ Curl_safefree(name);
+ Curl_safefree(value);
+ }
+
+ /* Any extra stuff at the end of the URL is an error */
+ if(*ptr)
+ return CURLE_URL_MALFORMAT;
+
+ 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;
+}
+
#endif /* CURL_DISABLE_IMAP */