With IMAP and POP3, I've started to embed CRLF into constant
response codes to avoid triggering CoW and extra memory traffic
in Perl.
The end goal is to enable more code sharing between IMAP, NNTP,
and POP3 inside one -netd process.
LINE_MAX => 512, # RFC 977 section 2.3
r501 => '501 command syntax error',
r502 => '502 Command unavailable',
LINE_MAX => 512, # RFC 977 section 2.3
r501 => '501 command syntax error',
r502 => '502 Command unavailable',
- r221 => '221 Header follows',
+ r221 => "221 Header follows\r\n",
r224 => '224 Overview information follows (multi-line)',
r224 => '224 Overview information follows (multi-line)',
- r225 => '225 Headers follow (multi-line)',
+ r225 => "225 Headers follow (multi-line)\r\n",
r430 => '430 No article with that message-id',
};
use PublicInbox::Syscall qw(EPOLLIN EPOLLONESHOT);
r430 => '430 No article with that message-id',
};
use PublicInbox::Syscall qw(EPOLLIN EPOLLONESHOT);
my ($self, $l) = @_;
my ($req, @args) = split(/[ \t]+/, $l);
return 1 unless defined($req); # skip blank line
my ($self, $l) = @_;
my ($req, @args) = split(/[ \t]+/, $l);
return 1 unless defined($req); # skip blank line
- $req = $self->can('cmd_'.lc($req));
- return res($self, '500 command not recognized') unless $req;
+ $req = $self->can('cmd_'.lc($req)) //
+ return $self->write(\"500 command not recognized\r\n");
return res($self, r501) unless args_ok($req, scalar @args);
my $res = eval { $req->($self, @args) };
return res($self, r501) unless args_ok($req, scalar @args);
my $res = eval { $req->($self, @args) };
sub cmd_quit ($) {
my ($self) = @_;
sub cmd_quit ($) {
my ($self) = @_;
- res($self, '205 closing connection - goodbye!');
+ $self->write(\"205 closing connection - goodbye!\r\n");
$self->requeue if $new_size == 1;
} else { # all done!
delete $self->{long_cb};
$self->requeue if $new_size == 1;
} else { # all done!
delete $self->{long_cb};
+ $self->write(\".\r\n");
my $elapsed = now() - $t0;
my $fd = fileno($self->{sock});
out($self, " deferred[$fd] done - %0.6f", $elapsed);
my $elapsed = now() - $t0;
my $fd = fileno($self->{sock});
out($self, " deferred[$fd] done - %0.6f", $elapsed);
$range = $self->{article} unless defined $range;
my $r = get_range($self, $range);
return $r unless ref $r;
$range = $self->{article} unless defined $range;
my $r = get_range($self, $range);
return $r unless ref $r;
- more($self, $xhdr ? r221 : r225);
+ $self->msg_more($xhdr ? r221 : r225);
long_response($self, \&hdr_msgid_range_i, @$r);
}
}
long_response($self, \&hdr_msgid_range_i, @$r);
}
}
$range = $self->{article} unless defined $range;
my $r = get_range($self, $range);
return $r unless ref $r;
$range = $self->{article} unless defined $range;
my $r = get_range($self, $range);
return $r unless ref $r;
- more($self, $xhdr ? r221 : r225);
+ $self->msg_more($xhdr ? r221 : r225);
long_response($self, \&xref_range_i, @$r);
}
}
long_response($self, \&xref_range_i, @$r);
}
}
$range = $self->{article} unless defined $range;
my $r = get_range($self, $range);
return $r unless ref $r;
$range = $self->{article} unless defined $range;
my $r = get_range($self, $range);
return $r unless ref $r;
- more($self, $xhdr ? r221 : r225);
+ $self->msg_more($xhdr ? r221 : r225);
long_response($self, \&smsg_range_i, @$r, $field);
}
}
long_response($self, \&smsg_range_i, @$r, $field);
}
}
} elsif ($sub =~ /\A:(bytes|lines)\z/) {
hdr_smsg($self, $xhdr, $1, $range);
} else {
} elsif ($sub =~ /\A:(bytes|lines)\z/) {
hdr_smsg($self, $xhdr, $1, $range);
} else {
- $xhdr ? (r221 . "\r\n.") : "503 HDR not permitted on $header";
+ $xhdr ? (r221 . '.') : "503 HDR not permitted on $header";
sub hdr_mid_response ($$$$$$) {
my ($self, $xhdr, $ibx, $n, $mid, $v) = @_;
sub hdr_mid_response ($$$$$$) {
my ($self, $xhdr, $ibx, $n, $mid, $v) = @_;
- my $res = '';
- if ($xhdr) {
- $res .= r221 . "\r\n";
- $res .= "$mid $v\r\n";
- } else {
- $res .= r225 . "\r\n";
- my $pfx = hdr_mid_prefix($self, $xhdr, $ibx, $n, $mid);
- $res .= "$pfx $v\r\n";
- }
- res($self, $res .= '.');
+ $self->write(($xhdr ? r221.$mid :
+ r225.hdr_mid_prefix($self, $xhdr, $ibx, $n, $mid)) .
+ " $v\r\n.\r\n");
return r502 if ($sock->can('accept_SSL') || $self->compressed);
my $opt = $self->{nntpd}->{accept_tls} or
return '580 can not initiate TLS negotiation';
return r502 if ($sock->can('accept_SSL') || $self->compressed);
my $opt = $self->{nntpd}->{accept_tls} or
return '580 can not initiate TLS negotiation';
- res($self, '382 Continue with TLS negotiation');
+ $self->write(\"382 Continue with TLS negotiation\r\n");
$self->{sock} = IO::Socket::SSL->start_SSL($sock, %$opt);
$self->requeue if PublicInbox::DS::accept_tls_step($self);
undef;
$self->{sock} = IO::Socket::SSL->start_SSL($sock, %$opt);
$self->requeue if PublicInbox::DS::accept_tls_step($self);
undef;