mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -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"
|
||||
|
||||
/* 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 */
|
||||
|
Loading…
Reference in New Issue
Block a user