Revision history for HTTP-Handy

1.06  2026-06-03 JST (Japan Standard Time)

    Fixes:
      - lib/HTTP/Handy.pm: HTTP::Handy::Input::read() no longer emits
        "Use of uninitialized value $_[1] in substr" when the caller
        passes an undefined buffer (the common "my $buf; $input->read(
        $buf, $len)" idiom, as used by PSGI request body readers). The
        in-place 4-argument substr now treats an undefined buffer as
        empty first, matching the built-in read() contract. The result
        was already correct; this only silences the warning under
        use warnings / $^W.

1.05  2026-05-17 JST (Japan Standard Time)

    Fixes:
      - Replace \do{local*_} globref pattern with named glob string
        (Package::FH::H<n>) in _log_message(), serve_static(), and
        _open_access_log(). Perl 5.005_03 does not support readline/
        print/binmode/close via globref; the named glob string approach
        works on Perl 5.005_03 and all later versions.
      - lib/HTTP/Handy.pm: add missing =head1 AUTHOR section (the author
        line was present but lacked the =head1 heading; MetaCPAN requires
        a proper =head1 AUTHOR section to populate the author sidebar).

1.04  2026-04-04 JST (Japan Standard Time)

    Fixes:
    - t/9050-pod.t: replace G11 implementation with Pod::Checker OO
      interface (Pod::Checker->new / num_errors / num_warnings) and
      split into G11 (errors) + G12 (warnings); plan updated from
      11 to 12 tests per .pm file.
    - t/9050-pod.t: skip G11 Pod::Checker errors check when
      Pod::Checker < 1.51 to avoid false FAILs caused by mis-reported
      errors for valid L</section>, L</"section">, and L<URL> syntax
      on older Perl installations (CPAN Testers FAIL fix).
    - t/9050-pod.t: skip G12 Pod::Checker warnings check when
      Pod::Checker < 1.60 to avoid false FAILs caused by mis-reported
      warnings for valid L<> link syntax on older Perl installations.
    - t/9050-pod.t: fix warnings stub guard to use
      !defined(&warnings::import) form (consistent with other 9xxx
      tests).

1.03  2026-03-24 JST (Japan Standard Time)

    Tests:
    - Added t/lib/INA_CPAN_Check.pm: shared test library providing
      TAP harness, file utilities, MANIFEST helpers, version/META
      parsers, code scanner, and check_A through check_K
      implementations (aligned with DB-Handy 1.07).
    - Added t/9001-load.t: module load, $VERSION, sub-package
      HTTP::Handy::Input, public methods (run/serve_static/etc.),
      and INA_CPAN_Check library export verification.
    - Added t/9010-encoding.t: US-ASCII, trailing whitespace, and
      end-of-file newline checks (replaces t/0007-usascii.t).
    - Added t/9020-perl5compat.t: Perl 5.005_03 syntax checks P1-P14
      covering .pm, .t, and eg/*.pl (replaces t/0008-perl5compat.t;
      adds P13 @-/@+ prohibition and P14 header order check).
    - Added t/9030-distribution.t: MANIFEST, version consistency,
      META integrity, Changes format, Makefile.PL, and test-suite
      consistency (replaces t/0009-cpan_precheck.t categories A-J).
    - Added t/9040-style.t: coding style E and K checks
      (replaces t/0009-cpan_precheck.t categories E/K).
    - Added t/9050-pod.t: POD structure/content G1-G11 including
      VERSION format, TABLE OF CONTENTS completeness, DIAGNOSTICS
      coverage, and Pod::Checker syntax check
      (replaces t/0006-pod.t).
    - Added t/9060-readme.t: README required sections check.
    - Added t/9070-examples.t: eg/ script quality E1-E6
      (no shebang, CVE fix, FindBin, boilerplate order,
      filename comment, Demonstrates section).
    - Added t/9080-cheatsheets.t: doc/ cheat sheet native script,
      section numbering, and [XX] header tag checks.
    - Removed t/0001-load.t: superseded by t/9001-load.t.
    - Removed t/0006-pod.t: superseded by t/9050-pod.t.
    - Removed t/0007-usascii.t: superseded by t/9010-encoding.t.
    - Removed t/0008-perl5compat.t: superseded by t/9020-perl5compat.t.
    - Removed t/0009-cpan_precheck.t: superseded by t/9030-t/9080.

    Fixes:
    - lib/HTTP/Handy.pm: warnings stub now guards with
      !defined(&warnings::import) to suppress "import redefined"
      warnings when multiple modules are loaded in sequence.
    - lib/HTTP/Handy.pm: DIAGNOSTICS =item for "Cannot bind" error
      corrected to E<lt>hostE<gt>:E<lt>portE<gt> form so that the
      G10 DIAGNOSTICS-coverage check passes.
    - t/0005-psgi-env.t: replaced my(undef,...) with array-index
      form for Perl 5.005_03 compatibility (P3 check).

1.02  2026-03-24 JST (Japan Standard Time)

    Documentation:
    - POD =head1 VERSION: corrected from "1.01" to "Version 1.02"
      (aligned with DB-Handy and LTSV-LINQ style).
    - POD =head1 TABLE OF CONTENTS: moved to correct position
      (after SYNOPSIS, before DESCRIPTION); was incorrectly placed
      after SEE ALSO.
    - eg/: removed shebang line (#!/usr/bin/perl) from all four
      eg/*.pl files (consistent with LTSV-LINQ 1.06 style).
    - doc/psgi_cheatsheet.*.txt: all 21 language cheat sheets
      rewritten; MN, MY, BN, HI, KM, KO, NE, SI, TH, TW, ZH, UR
      now use their respective native scripts (Cyrillic, Burmese,
      Bengali, Devanagari, Khmer, Hangul, Sinhala, Thai,
      Traditional/Simplified Chinese, Arabic); FR, TR, VI updated
      with proper diacritics and locale-specific characters.

1.01  2026-03-22 JST (Japan Standard Time)

    New features:
    - _iso_time(): new internal function returns the current local time as
      YYYY-MM-DDTHH:MM:SS using only localtime and sprintf.  Replaces the
      earlier use of POSIX::strftime, removing the POSIX dependency entirely.
    - _init_directories(): called once by run() at server startup.  Creates
      an Apache-like directory layout (logs/, logs/access/, logs/error/,
      run/, htdocs/, conf/) under the current working directory if the
      directories do not already exist.
    - Access log file rotation: in addition to STDERR, each LTSV access log
      line is now written to logs/access/YYYYMMDDHHm0.log.ltsv (10-minute
      rotation).  The filehandle is kept open between requests and reopened
      automatically when the interval changes.
    - Error log file: _log_message() now appends each startup/error message
      to logs/error/error.log in addition to STDERR.

    Robustness fixes:
    - serve_static(): replaced bareword filehandle (local *FH) with a
      lexical filehandle via eval q{open($fh,'<',$file)} on Perl 5.6+ and
      \do{local *_} on 5.005_03.
    - Response header processing: shift(@h) now falls back to '' (was undef).
    - Body joining: join('', @$body) is now guarded by "if @$body".

    Coding style aligned with DB-Handy and LTSV-LINQ:
    - Module header: added Compatible/Platform comment block.
    - use strict/warnings order unified: use strict -> BEGIN{warnings stub}
      -> use warnings; local $^W = 1; -> BEGIN { pop @INC } (DB-Handy style).
    - Section separators changed from # ---...--- (66 chars) to
      ###...### (79 chars) matching DB-Handy.
    - pmake.bat: install target now greps lib/**/*.pm only (DB-Handy style).

    Documentation:
    - REQUIREMENTS: removed POSIX from the module list (no longer used).
    - SERVER STARTUP: added Directory Initialisation and Error Log sections.
    - POD: added DIAGNOSTICS, BUGS AND LIMITATIONS, DESIGN PHILOSOPHY,
      and TABLE OF CONTENTS sections.
    - LICENSE -> COPYRIGHT AND LICENSE (aligned with DB-Handy).
    - AUTHOR: corrected to "INABA Hitoshi E<lt>ina.cpan@gmail.comE<gt>".
    - README: rewritten to DB-Handy structure with COMPATIBILITY (Perl
      5.005_03 philosophy), TARGET USE CASES, and COPYRIGHT AND LICENSE.

    Test suite improvements (knowledge from DB-Handy and LTSV-LINQ):

    Naming and style (from DB-Handy and LTSV-LINQ):
    - Renamed test files to 4-digit zero-padded format (0001-, 0002-, ...).
    - Rewrote functional test harnesses (t/0002-0005) to DB-Handy style:
      ###### header block, $PASS/$FAIL/$T variables, 1-line ok/is/like,
      print "1..N\n" plan, exit($FAIL ? 1 : 0) at end.
    - Added use strict, warnings compatibility stub, CVE-2016-1238
      mitigation, and use FindBin / use lib to all test files.
    - Removed shebang line (#!/usr/bin/perl) from all test files.

    New test files:
    - t/0008-perl5compat.t: Perl 5.005_03 compatibility checks (P1-P12).
    - t/0009-cpan_precheck.t: comprehensive pre-publication check suite
      (categories A-K, 198 tests).
    - t/0010-log.t: 28 tests for _iso_time, _init_directories,
      _open_access_log, and _log_message.
      END block now closes ACCESS_LOG_FH and restores STDERR before
      File::Path::rmtree to avoid "Permission denied" on Windows
      (open filehandles prevent deletion on Windows NTFS).

    Samples and documentation:
    - eg/01_hello_world.pl: minimal PSGI app (routing, query string, env dump).
    - eg/02_static_files.pl: serve_static, cache_max_age, mime_type.
    - eg/03_form_post.pl: POST body, parse_query, multi-value fields,
      Post-Redirect-Get pattern.
    - eg/04_ltsv_viewer.pl: is_htmx, LTSV log parsing, multiple status codes.
    - doc/psgi_cheatsheet.*.txt: PSGI cheat sheets in 21 languages covering
      run() options, $env keys, response format, utility methods, routing
      patterns, and links to the official PSGI specification.

    Additional documentation fixes:
    - POD DEMO section: corrected run command from
      "perl HTTP::Handy.pm" to "perl lib/HTTP/Handy.pm" (distribution
      directory form); added installed form using -MHTTP::Handy.
    - README: added DEMO section with corrected run command.
    - doc/psgi_cheatsheet.*.txt: corrected run command in all 21
      language cheat sheets.
    - POD: added INCLUDED DOCUMENTATION section listing eg/ and doc/ files.
    - POD: added DIAGNOSTICS entry for 'max_post_size' must be a number.
    - POD: TABLE OF CONTENTS now includes SEE ALSO.
    - README: added INCLUDED DOCUMENTATION section.
    - $VERSION declared via use vars (aligned with DB-Handy style).

1.00  2026-02-23 JST (Japan Standard Time)

    - First release on CPAN.
