1
0
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:
Steve Holme 2013-04-12 18:08:09 +01:00
parent 01e55ebb26
commit 9d0063befa

View File

@ -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 */