Revision history for LightTCP::SSLclient 1.06 2026-01-18 BUG FIXES: - Fixed IPv6 port handling bug in _resolve_redirect() that incorrectly prepended port number to path instead of storing in Host header - Sanitized proxy credentials from verbose debug output to prevent leakage - Replaced hardcoded 8192 buffer size with configurable buffer_size option FEATURES: - Added is_keep_alive() accessor method for boolean keep-alive check - Added set_buffer_size() method to configure read buffer at runtime 1.05 2026-01-18 FEATURES: - Added redirect following support via request_with_redirects() method - Added max_redirects option (default: 5) - Added follow_redirects option (default: 1) - Added redirect history tracking with get_redirect_history() - Added get_redirect_count() to track redirects in last request - Added accessor methods: get_max_redirects(), get_follow_redirects(), set_max_redirects(), set_follow_redirects() - POST-to-GET conversion on 301/302 redirects (RFC-compliant) - Method preservation on 307/308 redirects - Support for absolute and relative redirect URLs INTERNAL: - Added _resolve_redirect() for URL resolution - Added _resolve_relative_path() for relative path handling - Added _do_request_with_redirects() recursive redirect handler - Added _redirect_count and _redirect_history fields - Added t/05_redirects.t for redirect tests EXAMPLE: my ($code, $state, $headers, $body, $errors, $debug, $resp_code, $history) = $client->request_with_redirects('POST', '/submit', host => 'example.com'); foreach my $r (@$history) { print "$r->{code}: $r->{from} -> $r->{to}\n"; } 1.04 2026-01-18 SECURITY FIXES: - Added SSL_protocols option to restrict to TLSv1.2+ only - Added SSL_cipher_list option for configurable cipher suites - Fixed IPv6 proxy address parsing vulnerability - Fixed byte-by-byte chunk reading that caused severe performance issues - Filtered sensitive data (SSL_key_file, SSL_cert_file) from debug output BUG FIXES: - Fixed mixed buffered/unbuffered I/O conflict by replacing <$socket> with sysread - Fixed ignored sysread return values that could corrupt subsequent reads - Added verification of trailing CRLF after chunk data - Added timeout protection to request() method FEATURES: - Made User-Agent configurable via user_agent option - Added accessor methods: get_cert(), get_insecure(), get_ssl_protocols(), get_ssl_ciphers(), get_keep_alive(), get_buffer_size() - Added setter methods: set_timeout(), set_insecure(), set_keep_alive(), set_cert() - Added keep-alive support via keep_alive option - Added DESTROY() method for automatic cleanup - Added reconnect() method to re-establish connection - Added buffer_size option for configurable read buffer API CHANGES (BREAKING): - All methods now return 4 values: (ok, errors, debug, error_code) - response() returns: (code, state, headers, body, errors, debug, error_code) - Error codes exported: ECONNECT, EREQUEST, ERESPONSE, ETIMEOUT, ESSL PERFORMANCE: - Replaced byte-by-byte chunk line reading with buffered _read_until_delimiter() - _read_line_from_socket() now uses buffered reading INTERNAL: - Added _parse_proxy_address() for robust IPv6 support - Added _buffer field for persistent read buffer - Added _target_host, _target_port, _proxy, _proxy_auth for reconnect - Added t/04_helpers.t for helper tests 1.03 2025-12-20 - Original release