mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
imap: Moved utility functions to end of imap.c (Part 2/3)
Moved imap_parse_url_path() and imap_parse_custom_request() to the end of the file allowing all utility functions to be grouped together.
This commit is contained in:
parent
01e55ebb26
commit
9d0063befa
286
lib/imap.c
286
lib/imap.c
@ -86,8 +86,6 @@
|
|||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
/* Local API functions */
|
/* 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_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,
|
||||||
@ -101,6 +99,8 @@ static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
|
|||||||
static CURLcode imap_setup_connection(struct connectdata *conn);
|
static CURLcode imap_setup_connection(struct connectdata *conn);
|
||||||
static char *imap_atom(const char *str);
|
static char *imap_atom(const char *str);
|
||||||
static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...);
|
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.
|
* 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 */
|
/* 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)
|
||||||
{
|
{
|
||||||
@ -2326,4 +2185,145 @@ static char *imap_atom(const char *str)
|
|||||||
return newstr;
|
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 */
|
#endif /* CURL_DISABLE_IMAP */
|
||||||
|
Loading…
Reference in New Issue
Block a user