]> Sergey Matveev's repositories - public-inbox.git/commitdiff
imap: further speed up HEADER.FIELDS FETCH requests
authorEric Wong <e@yhbt.net>
Wed, 10 Jun 2020 07:05:10 +0000 (07:05 +0000)
committerEric Wong <e@yhbt.net>
Sat, 13 Jun 2020 07:55:45 +0000 (07:55 +0000)
Since headers are big and include a lot of lines MUAs don't
care about, we can skip the CRLF_HDR ops and just do the
CRLF conversion in partial_hdr_get and partial_hdr_not.
This is another 10-15% speedup for mutt w/o header caching.

lib/PublicInbox/IMAP.pm

index 3cc68e668720814a9135ace5901ce43af2cf02c3..fe3c7d1a85bba20174642fb9399dce902bcdf0f8 100644 (file)
@@ -792,6 +792,7 @@ sub partial_hdr_not {
        }
        my $str = $eml->header_obj->as_string;
        $str =~ s/$hdrs_re//g;
+       $str =~ s/(?<!\r)\n/\r\n/sg;
        $str .= "\r\n";
 }
 
@@ -802,7 +803,9 @@ sub partial_hdr_get {
                $eml = eml_body_idx($eml, $section_idx) or return;
        }
        my $str = $eml->header_obj->as_string;
-       join('', ($str =~ m/($hdrs_re)/g), "\r\n");
+       $str = join('', ($str =~ m/($hdrs_re)/g));
+       $str =~ s/(?<!\r)\n/\r\n/sg;
+       $str .= "\r\n";
 }
 
 sub partial_prepare ($$$$) {
@@ -828,7 +831,11 @@ sub partial_prepare ($$$$) {
                                                : \&partial_hdr_get,
                                                $1, undef, $4, $5 ];
                $tmp->[2] = hdrs_regexp($3);
-               $$need |= CRLF_HDR|EML_HDR;
+
+               # don't emit CRLF_HDR instruction, here, partial_hdr_*
+               # will do CRLF conversion with only the extracted result
+               # and not waste time converting lines we don't care about.
+               $$need |= EML_HDR;
        } else {
                undef;
        }