mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
imap: Removed the need for separate custom request functions
Moved the custom request processing into the LIST command as the logic is the same.
This commit is contained in:
parent
69eca5c252
commit
6bdd3d4a88
51
lib/imap.c
51
lib/imap.c
@ -398,7 +398,12 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
|
||||
break;
|
||||
|
||||
case IMAP_LIST:
|
||||
if(!imap_matchresp(line, len, "LIST"))
|
||||
if((!imap->custom && !imap_matchresp(line, len, "LIST")) ||
|
||||
(imap->custom && !imap_matchresp(line, len, imap->custom) &&
|
||||
(strcmp(imap->custom, "STORE") ||
|
||||
!imap_matchresp(line, len, "FETCH")) &&
|
||||
strcmp(imap->custom, "SELECT") &&
|
||||
strcmp(imap->custom, "EXAMINE")))
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
@ -412,20 +417,6 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
case IMAP_CUSTOM:
|
||||
/* When dealing with a custom command, we are interested in all
|
||||
intermediate responses which match the parameter name. The
|
||||
exceptions are STORE, which returns untagged responses as FETCH,
|
||||
and SELECT and EXAMINE commands, for which no filtering is (or can
|
||||
be easily) done. */
|
||||
if(!imap_matchresp(line, len, imap->custom) &&
|
||||
(strcmp(imap->custom, "STORE") ||
|
||||
!imap_matchresp(line, len, "FETCH")) &&
|
||||
strcmp(imap->custom, "SELECT") &&
|
||||
strcmp(imap->custom, "EXAMINE"))
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
/* Ignore other untagged responses */
|
||||
default:
|
||||
return FALSE;
|
||||
@ -493,7 +484,6 @@ static void state(struct connectdata *conn, imapstate newstate)
|
||||
"FETCH_FINAL",
|
||||
"APPEND",
|
||||
"APPEND_FINAL",
|
||||
"CUSTOM",
|
||||
"LOGOUT",
|
||||
/* LAST */
|
||||
};
|
||||
@ -696,6 +686,11 @@ static CURLcode imap_list(struct connectdata *conn)
|
||||
struct IMAP *imap = data->state.proto.imap;
|
||||
char *mailbox;
|
||||
|
||||
if(imap->custom)
|
||||
/* Send the custom request */
|
||||
result = imap_sendf(conn, "%s%s", imap->custom,
|
||||
imap->custom_params ? imap->custom_params : "");
|
||||
else {
|
||||
/* Make sure the mailbox is in the correct atom format */
|
||||
mailbox = imap_atom(imap->mailbox ? imap->mailbox : "");
|
||||
if(!mailbox)
|
||||
@ -705,6 +700,7 @@ static CURLcode imap_list(struct connectdata *conn)
|
||||
result = imap_sendf(conn, "LIST \"%s\" *", mailbox);
|
||||
|
||||
Curl_safefree(mailbox);
|
||||
}
|
||||
|
||||
if(!result)
|
||||
state(conn, IMAP_LIST);
|
||||
@ -803,24 +799,6 @@ static CURLcode imap_append(struct connectdata *conn)
|
||||
return result;
|
||||
}
|
||||
|
||||
static CURLcode imap_custom(struct connectdata *conn)
|
||||
{
|
||||
struct IMAP *imap = conn->data->state.proto.imap;
|
||||
|
||||
/* Send the custom request */
|
||||
CURLcode result = imap_sendf(conn, "%s%s", imap->custom,
|
||||
imap->custom_params ? imap->custom_params : "");
|
||||
|
||||
if(!result) {
|
||||
/* We don't know how much data will be received */
|
||||
Curl_pgrsSetDownloadSize(conn->data, -1);
|
||||
|
||||
state(conn, IMAP_CUSTOM);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* imap_logout()
|
||||
@ -1391,7 +1369,7 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode,
|
||||
imapc->mailbox = strdup(imap->mailbox);
|
||||
|
||||
if(imap->custom)
|
||||
result = imap_custom(conn);
|
||||
result = imap_list(conn);
|
||||
else
|
||||
result = imap_fetch(conn);
|
||||
}
|
||||
@ -1650,7 +1628,6 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
|
||||
break;
|
||||
|
||||
case IMAP_LIST:
|
||||
case IMAP_CUSTOM:
|
||||
result = imap_state_list_resp(conn, imapcode, imapc->state);
|
||||
break;
|
||||
|
||||
@ -1891,7 +1868,7 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected,
|
||||
result = imap_append(conn);
|
||||
else if(imap->custom && (selected || !imap->mailbox))
|
||||
/* Custom command using the same mailbox or no mailbox */
|
||||
result = imap_custom(conn);
|
||||
result = imap_list(conn);
|
||||
else if(!imap->custom && selected && imap->uid)
|
||||
/* FETCH from the same mailbox */
|
||||
result = imap_fetch(conn);
|
||||
|
@ -51,7 +51,6 @@ typedef enum {
|
||||
IMAP_FETCH_FINAL,
|
||||
IMAP_APPEND,
|
||||
IMAP_APPEND_FINAL,
|
||||
IMAP_CUSTOM,
|
||||
IMAP_LOGOUT,
|
||||
IMAP_LAST /* never used */
|
||||
} imapstate;
|
||||
|
Loading…
Reference in New Issue
Block a user