about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/POP3.pm3
-rw-r--r--t/pop3d.t11
2 files changed, 12 insertions, 2 deletions
diff --git a/lib/PublicInbox/POP3.pm b/lib/PublicInbox/POP3.pm
index 51c2b71a..2c20c84b 100644
--- a/lib/PublicInbox/POP3.pm
+++ b/lib/PublicInbox/POP3.pm
@@ -300,12 +300,13 @@ sub retr_cb { # called by git->cat_async via ibx_async_cat
                 $hdr .= "\r\n\r\n";
                 my @tmp = split(/^/m, $bdy);
                 $hdr .= join('', splice(@tmp, 0, $top_nr));
+        } elsif (exists $self->{expire}) {
+                $self->{expire} .= pack('S', $off + 1);
         }
         $$bref =~ s/^\./../gms;
         $$bref .= substr($$bref, -2, 2) eq "\r\n" ? ".\r\n" : "\r\n.\r\n";
         $self->msg_more("+OK message follows\r\n");
         $self->write($bref);
-        $self->{expire} .= pack('S', $off + 1) if exists $self->{expire};
         $self->requeue;
 }
 
diff --git a/t/pop3d.t b/t/pop3d.t
index d5ccb0d8..3d70935f 100644
--- a/t/pop3d.t
+++ b/t/pop3d.t
@@ -240,8 +240,17 @@ EOF
         ok(defined($capa->{PIPELINING}), 'pipelining supported by CAPA');
         is($capa->{EXPIRE}, 0, 'EXPIRE 0 set');
 
-        # clients which see "EXPIRE 0" can elide DELE requests
+        # ensure TOP doesn't trigger "EXPIRE 0" like RETR does (cf. RFC2449)
         my $list = $oldc->list;
+        ok(scalar keys %$list, 'got a listing of messages');
+        ok($oldc->top($_, 1), "TOP $_ 1") for keys %$list;
+        ok($oldc->quit, 'QUIT after TOP');
+
+        # clients which see "EXPIRE 0" can elide DELE requests
+        $oldc = Net::POP3->new(@old_args);
+        ok($oldc->apop("$locked_mb.0", 'anonymous'), 'APOP for RETR');
+        is_deeply($oldc->capa, $capa, 'CAPA unchanged');
+        is_deeply($oldc->list, $list, 'LIST unchanged by previous TOP');
         ok($oldc->get($_), "RETR $_") for keys %$list;
         ok($oldc->quit, 'QUIT after RETR');