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