]> Sergey Matveev's repositories - public-inbox.git/blob - lib/PublicInbox/MID.pm
use raw header for Message-ID
[public-inbox.git] / lib / PublicInbox / MID.pm
1 # Copyright (C) 2015 all contributors <meta@public-inbox.org>
2 # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
3 #
4 # Various Message-ID-related functions.
5 package PublicInbox::MID;
6 use strict;
7 use warnings;
8 use base qw/Exporter/;
9 our @EXPORT_OK = qw/mid_clean id_compress mid2path mid_mime/;
10 use Digest::SHA qw/sha1_hex/;
11 use constant MID_MAX => 40; # SHA-1 hex length
12
13 sub mid_clean {
14         my ($mid) = @_;
15         defined($mid) or die "no Message-ID";
16         # MDA->precheck did more checking for us
17         if ($mid =~ /<([^>]+)>/) {
18                 $mid = $1;
19         }
20         $mid;
21 }
22
23 # this is idempotent
24 sub id_compress {
25         my ($id, $force) = @_;
26
27         if ($force || $id =~ /[^\w\-]/ || length($id) > MID_MAX) {
28                 return sha1_hex($id);
29         }
30         $id;
31 }
32
33 sub mid2path {
34         my ($mid) = @_;
35         my ($x2, $x38) = ($mid =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/);
36
37         unless (defined $x38) {
38                 # compatibility with old links (or short Message-IDs :)
39                 $mid = sha1_hex(mid_clean($mid));
40                 ($x2, $x38) = ($mid =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/);
41         }
42         "$x2/$x38";
43 }
44
45 sub mid_mime ($) { $_[0]->header_obj->header_raw('Message-ID') }
46
47 1;