Revision history for HTTP-Handy
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.orgE<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.