1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

Added support for LISTing a single POP3 message

Added tests for a number of POP3 LIST operations, including one
that shows a curl problem when listing no messages, so is
disabled.
This commit is contained in:
Dan Fandrich 2011-03-17 16:59:30 -07:00
parent 409867e62b
commit ef1c18b952
9 changed files with 229 additions and 3 deletions

View File

@ -436,6 +436,24 @@ static CURLcode pop3_state_list_resp(struct connectdata *conn,
return result; return result;
} }
/* for LIST response with a given message */
static CURLcode pop3_state_list_single_resp(struct connectdata *conn,
int pop3code,
pop3state instate)
{
CURLcode result = CURLE_OK;
struct SessionHandle *data = conn->data;
(void)instate; /* no use for this yet */
if(pop3code != 'O') {
failf(data, "Invalid message. %c", pop3code);
result = CURLE_REMOTE_FILE_NOT_FOUND;
}
state(conn, POP3_STOP);
return result;
}
/* start the DO phase for RETR */ /* start the DO phase for RETR */
static CURLcode pop3_retr(struct connectdata *conn) static CURLcode pop3_retr(struct connectdata *conn)
{ {
@ -460,7 +478,10 @@ static CURLcode pop3_list(struct connectdata *conn)
if(result) if(result)
return result; return result;
state(conn, POP3_LIST); if (strlen(pop3c->mailbox))
state(conn, POP3_LIST_SINGLE);
else
state(conn, POP3_LIST);
return result; return result;
} }
@ -523,6 +544,10 @@ static CURLcode pop3_statemach_act(struct connectdata *conn)
result = pop3_state_list_resp(conn, pop3code, pop3c->state); result = pop3_state_list_resp(conn, pop3code, pop3c->state);
break; break;
case POP3_LIST_SINGLE:
result = pop3_state_list_single_resp(conn, pop3code, pop3c->state);
break;
case POP3_QUIT: case POP3_QUIT:
/* fallthrough, just stop! */ /* fallthrough, just stop! */
default: default:
@ -747,7 +772,7 @@ CURLcode pop3_perform(struct connectdata *conn,
/* If mailbox is empty, then assume user wants listing for mail IDs, /* If mailbox is empty, then assume user wants listing for mail IDs,
* otherwise, attempt to retrieve the mail-id stored in mailbox * otherwise, attempt to retrieve the mail-id stored in mailbox
*/ */
if (strlen(pop3c->mailbox)) if (strlen(pop3c->mailbox) && !conn->data->set.ftp_list_only)
result = pop3_retr(conn); result = pop3_retr(conn);
else else
result = pop3_list(conn); result = pop3_list(conn);

View File

@ -33,6 +33,7 @@ typedef enum {
POP3_PASS, POP3_PASS,
POP3_STARTTLS, POP3_STARTTLS,
POP3_LIST, POP3_LIST,
POP3_LIST_SINGLE,
POP3_RETR, POP3_RETR,
POP3_QUIT, POP3_QUIT,
POP3_LAST /* never used */ POP3_LAST /* never used */

View File

@ -3,3 +3,4 @@
# per line. # per line.
# Lines starting with '#' letters are treated as comments. # Lines starting with '#' letters are treated as comments.
564 564
811

View File

@ -70,7 +70,8 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
test313 test1115 test578 test579 test1116 test1200 test1201 test1202 \ test313 test1115 test578 test579 test1116 test1200 test1201 test1202 \
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \ test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \ test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \
test1304 test1305 test1306 test1307 test582 test583 test1304 test1305 test1306 test1307 test582 test583 test808 test809 \
test810 test811
filecheck: filecheck:
@mkdir test-place; \ @mkdir test-place; \

41
tests/data/test808 Normal file
View File

@ -0,0 +1,41 @@
<testcase>
<info>
<keywords>
POP3
LIST
</keywords>
</info>
#
# Server-side
<reply>
<servercmd>
REPLY LIST +OK 808 100
</servercmd>
</reply>
#
# Client-side
<client>
<server>
pop3
</server>
<name>
POP3 LIST one message
</name>
<command>
pop3://%HOSTIP:%POP3PORT/808 -l -u user:secret
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
USER user
PASS secret
LIST 808
QUIT
</protocol>
</verify>
</testcase>

45
tests/data/test809 Normal file
View File

@ -0,0 +1,45 @@
<testcase>
<info>
<keywords>
POP3
LIST
FAILURE
</keywords>
</info>
#
# Server-side
<reply>
<servercmd>
REPLY LIST -ERR no such message
</servercmd>
</reply>
#
# Client-side
<client>
<server>
pop3
</server>
<name>
POP3 LIST invalid message
</name>
<command>
pop3://%HOSTIP:%POP3PORT/809 -l -u user:secret
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<errorcode>
78
</errorcode>
<protocol>
USER user
PASS secret
LIST 809
QUIT
</protocol>
</verify>
</testcase>

45
tests/data/test810 Normal file
View File

@ -0,0 +1,45 @@
<testcase>
<info>
<keywords>
POP3
LIST
</keywords>
</info>
#
# Server-side
<reply>
# When doing LIST, we get the default list output hard-coded in the test
# POP3 server
<datacheck>
1 100
2 4294967400
4 200
</datacheck>
</reply>
#
# Client-side
<client>
<server>
pop3
</server>
<name>
POP3 LIST messages
</name>
<command>
pop3://%HOSTIP:%POP3PORT/ -u user:secret
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
USER user
PASS secret
LIST
QUIT
</protocol>
</verify>
</testcase>

43
tests/data/test811 Normal file
View File

@ -0,0 +1,43 @@
<testcase>
<info>
<keywords>
POP3
LIST
</keywords>
</info>
#
# Server-side
<reply>
<servercmd>
REPLY LIST +OK but no messages\r\n.
</servercmd>
<datacheck>
</datacheck>
</reply>
#
# Client-side
<client>
<server>
pop3
</server>
<name>
POP3 LIST no messages available
</name>
<command>
pop3://%HOSTIP:%POP3PORT/ -u user:secret
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
USER user
PASS secret
LIST
QUIT
</protocol>
</verify>
</testcase>

View File

@ -392,6 +392,7 @@ sub protocolsetup {
elsif($proto eq 'pop3') { elsif($proto eq 'pop3') {
%commandfunc = ( %commandfunc = (
'RETR' => \&RETR_pop3, 'RETR' => \&RETR_pop3,
'LIST' => \&LIST_pop3,
); );
%displaytext = ( %displaytext = (
'USER' => '+OK We are happy you popped in!', 'USER' => '+OK We are happy you popped in!',
@ -683,6 +684,29 @@ sub RETR_pop3 {
return 0; return 0;
} }
sub LIST_pop3 {
# this is a built-in fake-message list
my @pop3list=(
"1 100\r\n",
"2 4294967400\r\n", # > 4 GB
"4 200\r\n", # Note that message 3 is a simulated "deleted" message
);
logmsg "retrieve a message list\n";
sendcontrol "+OK Listing starts\r\n";
for my $d (@pop3list) {
sendcontrol $d;
}
# end with the magic 5-byte end of listing marker
sendcontrol "\r\n.\r\n";
return 0;
}
################ ################
################ FTP commands ################ FTP commands
################ ################