From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: meta@public-inbox.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id E88DD1F428 for ; Tue, 22 Sep 2015 10:09:51 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/7] nntp: support YYYYMMDD dates for commands Date: Tue, 22 Sep 2015 10:09:43 +0000 Message-Id: <20150922100948.8160-3-e@80x24.org> In-Reply-To: <20150922100948.8160-1-e@80x24.org> References: <20150922100948.8160-1-e@80x24.org> List-Id: RFC 3977 supports YYYYMMDD dates while retaining backwards compatibility for old YYMMDD dates. --- lib/PublicInbox/NNTP.pm | 18 +++++++++++------- t/nntp.t | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 91b10f2..bc8d6ed 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -169,22 +169,26 @@ sub cmd_listgroup ($;$) { sub parse_time ($$;$) { my ($date, $time, $gmt) = @_; use Time::Local qw(); - my ($YY, $MM, $DD) = unpack('A2A2A2', $date); my ($hh, $mm, $ss) = unpack('A2A2A2', $time); if (defined $gmt) { $gmt =~ /\A(?:UTC|GMT)\z/i or die "GM invalid: $gmt\n"; $gmt = 1; } my @now = $gmt ? gmtime : localtime; - if ($YY > strftime('%y', @now)) { - my $cur_year = $now[5] + 1900; - $YY += int($cur_year / 1000) * 1000 - 100; + my ($YYYY, $MM, $DD); + if (length($date) == 8) { # RFC 3977 allows YYYYMMDD + ($YYYY, $MM, $DD) = unpack('A4A2A2', $date); + } else { # legacy clients send YYMMDD + ($YYYY, $MM, $DD) = unpack('A2A2A2', $date); + if ($YYYY > strftime('%y', @now)) { + my $cur_year = $now[5] + 1900; + $YYYY += int($cur_year / 1000) * 1000 - 100; + } } - if ($gmt) { - Time::Local::timegm($ss, $mm, $hh, $DD, $MM - 1, $YY); + Time::Local::timegm($ss, $mm, $hh, $DD, $MM - 1, $YYYY); } else { - Time::Local::timelocal($ss, $mm, $hh, $DD, $MM - 1, $YY); + Time::Local::timelocal($ss, $mm, $hh, $DD, $MM - 1, $YYYY); } } diff --git a/t/nntp.t b/t/nntp.t index 82918ff..c917888 100644 --- a/t/nntp.t +++ b/t/nntp.t @@ -61,4 +61,33 @@ use_ok 'PublicInbox::NNTP'; ngpat_like('a.s.r', 'a.t,a.s.*'); } +{ + use POSIX qw(strftime); + sub time_roundtrip { + my ($date, $time, $gmt) = @_; + my $m = join(' ', @_); + my $ts = PublicInbox::NNTP::parse_time(@_); + my @t = gmtime($ts); + my ($d, $t); + if (length($date) == 8) { + ($d, $t) = split(' ', strftime('%Y%m%d %H%M%S', @t)); + } else { + ($d, $t) = split(' ', strftime('%g%m%d %H%M%S', @t)); + } + is_deeply([$d, $t], [$date, $time], "roundtripped: $m"); + $ts; + } + my $x1 = time_roundtrip(qw(20141109 060606 GMT)); + my $x2 = time_roundtrip(qw(141109 060606 GMT)); + my $x3 = time_roundtrip(qw(930724 060606 GMT)); + + SKIP: { + skip('YYMMDD test needs updating', 2) if (time > 0x7fffffff); + # our world probably ends in 2038, but if not we'll try to + # remember to update the test then + is($x1, $x2, 'YYYYMMDD and YYMMDD parse identically'); + is(strftime('%Y', gmtime($x3)), '1993', '930724 was in 1993'); + } +} + done_testing(); -- EW