The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Revision history for Perl extension CGI::Header.

0.32  Mar 9th, 2013

  - Add CGI::Header::Redirect, an adapter for the CGI::redirect() function.
    CGI::Header::Redirect inherits from CGI::Header, and also overrides
    some methods.

0.31  Mar 8th, 2013

  - add get_alias() which returns the alias of the given property name:

      my $alias = CGI::Header->get_alias('content_type'); # => 'type'

0.30  Mar 4th, 2013

  - The following operators are overloaded:

      ""   -> as_string
      bool -> SCALAR

  - env() is obsolete and will be removed in 0.31.

  [DOCUMENTATION]

    Add "WRITING Blosxom PLUGINS" to "EXAMPLES"

  [INCOMPATIBLE CHANGES]

    Summary: env() was replaced with query()

    - Add query() method which returns your query object.
      You can't pass your current environment (\%ENV) to new() anymore.
      Namely,

        my $header = { -type => 'text/plain' };
        my $h = CGI::Header->new( $header, \%ENV );

      become

        use CGI;
        my $query = CGI->new;
        my $h = CGI::Header->new( $header, $query );

      query() defaults to $CGI::Q. Functions exported by CGI.pm
      depends on this query object. In other words, when you choose
      the procedural interface of CGI.pm, the module behaves like
      a Singleton class.

        # $query can be omitted when you choose the procedural
        # interface of CGI.pm
        my $h = CGI::Header->new( $header );

    - as_string() become a shortcut for:

        $h->query->header( $h->header )

      and so you can't pass $eol to as_string() anymore.

   [ROADMAP]

     CGI::Header is not compatible with CGI::Simple at this time.
     This module will be adapted to CGI::Simple gradually.
     (no_cache() isn't supported by CGI.pm, for example)

0.22  Feb 26th, 2013

  This distribution doesn't contain CGI::Header::PSGI anymore,
  which was separated into another distribution, CGI-Header-PSGI.

  The following files were removed:

    - lib/CGI/Header/PSGI.pm
    - t/31_psgi_header.t
    - t/40_psgi_header.t
    - t/41_psgi_redirect.t

  This distribution doesn't require the following modules anymore:

    - Exporter
    - CGI::PSGI (for testing)

  There are no code changes besides incrementing the version number
  since CGI-Header-0.21.

0.21  Feb 25th, 2013

  [CGI::Header::PSGI]

    - psgi_header() is compatible with CGI::Simple's header() method.
      Namely, psgi_header() can be configured by no_cache() method.
      If no_cache() isn't available, that method will be ignored simply.
      And so psgi_header() is compatible with CGI.pm as well.

    - I'm not sure about whether to use Role::Tiny ;)

    - [BUG FIX] psgi_redirect() invokes self_url(), not url()

    - Imports CGI::PSGI's psgi_headers.t and redirect.t

0.20  Feb 24th, 2013

  - Add "REQUIRED METHODS" to CGI::Header::PSGI's POD

0.19  Feb 11th, 2013

  Add CGI::Header::PSGI which exports two methods on demand: psgi_header()
  and psgi_redirect().

    use parent 'CGI';
    use CGI::Header::PSGI qw(psgi_header psgi_redirect);

  CGI::Header::PSGI helps you create your own CGI::PSGI-compatible class.

  [INCOMPATIBLE CHANGES]

    - rehash() and new() rename '-uri' and '-url' to '-location'

    - flatten() and each() stringify CGI::Cookie objects by default.

0.18  Feb 9th, 2013

  - You can pass a media type to new() in the following situation:

      my $h = CGI::Header->new('text/plain');
      $h->header; # => { -type => 'text/plain' }

  - new() throws an exception in the following situation:

      my $h = CGI::Header->new( -foo => 'bar', '-baz' );
      # die "Odd number of elements in hash assignment"

  [STATE OF THIS MODULE]

    The following methods are unstable:

      - $h->set( 'Content-Type => $value )
      - $h->set( 'P3P' => $value )
      - $h->set( 'Expires' => $value )

        I'm not sure about how to process these headers properly at this time.

0.17  Jan 18th, 2013

  [DOCUMENTATION]

    - Add "EXAMPLES" and "DEPENDENCIES"

  [INTERNALS]

    - Fix META.yml ("version" was broken)

0.16  Jan 14th, 2013

  [INCOMPATIBLE CHANGES]

    - rehash() throws an exception when a property name is duplicated:

        my $header = {
            -Type        => 'text/plain',
            Content_Type => 'text/html',
        };

        my $h = CGI::Header->new( $header );
        $h->rehash; # die "Property '-type' already exists"

      If it was allowed to overwrite existent properties,
      it would be essentially impossible to predict 
      the overwritten value of '-type' in the above example:

        $h->header->{-type}; # => 'text/html' or 'text/plain' ?

    - In addition to CGI.pm-compatible HTTP header properties,
      new() accepts '-env' property which represents your current environment:

        my $h = CGI::Header->new(
            -type => 'text/plain',
            -env  => \%ENV,
        );

        $h->header; # => { -type => 'text/plain' }
        $h->env;    # => \%ENV

      Unlike the above case, if a property name is duplicated,
      that property will be overwritten silently:

        my $h = CGI::Header->new(
            -Type        => 'text/plain',
            Content_Type => 'text/html',
        );

        $h->header->{-type}; # => "text/html"

  [INTERNALS]

    Add a subtest called 'as_string()' to t/10_basic.t

0.15  Jan 11th, 2013

  Add env() which defaults to \%ENV. new() receives an additional
  argument which determines the value of the attribute.
     my $header = CGI::Header->new({ -type => 'text/plain' }, \%ENV);
     $header->env; # => \%ENV

  [INTERNALS]

    - Add psgi_headers.t which requires CGI::PSGI
    - new() returns an object based on a blessed hash.

0.14  Jan 9th, 2013

  - set() and delete() throw exceptions when the specified header field
    is read-only.
  - get() returns undef in the following situations:

      $header->header; # => { -expires => q{}, ... }
      $header->get( 'Expires' ); # => undef

      $header->header; # => { -p3p => q{}, ... }
      $header->get( 'P3P' ); # => undef

  [INTERNALS]

    id() is aliased to Scalar::Util::refaddr()

0.13  Jan 8th, 2013

  - clear() and each() return the current object itself
  - set() returns the given value:
      $header->set( 'Foo' => 'bar' ); # => "bar"

  [BUG FIXES]

    Correct the following warning message:
      "Can't set '-content_type' to neither undef nor an empty string"
    This message was replaced with:
      "Can set '-content_type' to neither undef nor an empty string"

  [DOCUMENTATION]

    Add "Server" and "Date" to "LIMITATIONS" 

0.12  Jan 7th, 2013

  [INTERNALS]
    - Rename _normalize() to _lc()
    - Add a benchmark against HTTP::Response->parse

  [DOCUMENTATION]
    - Add HTTP::Headers to "SEE ALSO"

0.11  Dec 16th, 2012
  - Add FIRSTKEY() and NEXTKEY(). These methods were implemented to
    test this module itself.
  - flatten() receives optional $is_recursive argument
    which determines whether to flatten the Set-Cookie headers recursively.
    $is_recursive defaults to true.
  - flatten() and each() don't stringify CGI::Cookie objects.
  - field_names() returns a list of field names in a random order

0.10  Dec 14th, 2012
  - p3p_tags() returns the number of P3P tags
    instead of the first element in scalar context
  - rehash() returns the current object itself:
      my @headers = CGI::Header->new(@args)->rehash->flatten;
  - each() doesn't depend on field_names().
    field_names() depends on each().
    As a result, if Set-Cookie header is multi-valued,
    field_names() will return a list which contains duplicate values.
    I don't know how to solve this problem at this time.

0.09  Nov 13th, 2012
  - CGI.pm has charset() attribute which defaults to 'ISO-8859-1'.
    CGI::header() function depends on this attribute.
    I noticed this module depends on the default value, 'ISO-8859-1',
    and so decided to remove this dependency because this module
    shouldn't depend on the internal state of CGI.pm.
    Namely,
        my $h = CGI::Header->new( -type => 'text/plain' );
        $h->get( 'Content-Type' ); # => "text/plain; charset=ISO-8859-1"
    become
        $h->get( 'Content-Type' ); # => "text/plain"

0.08  Nov 13th, 2012
  - reimplemented rehash()
  - [DOCUMENTATION] add header() to "INSTANCE METHODS"
  - [DOCUMENTATION] describe how this module normalizes parameter names

0.07  Nov 12th, 2012
  - [DOCUMENTATION] add "tie() INTERFACE"

0.06  Nov 11th, 2012
  - First release

0.05  Nov 10th, 2012
  - add rehash() method which rebuilds header hash references

0.04  Nov 7th, 2012
  - reorganized tests using subtest() function exported by Test::More
  - doesn't overload '""' (stringify) with as_string()
    because this module isn't the replacement of CGI::header() function.
    I think CGI::header() should be used to stringify
    header hash references in most cases.
  - each() doesn't stringify values (cf. HTTP::Headers->scan),
    and so the callback function will receive raw CGI::Cookie objects.
  - On the other hand, flatten() forces stringification.
    flatten() may be called to generate PSGI-compatible header array
    references.

0.03  Oct 7th, 2012
  - add a benchmark against HTTP::Parser::XS
  - update POD
  - add t/server.t
  - tests require CGI.pm 3.51 because the distribution contains t/headers.t

0.02  Oct 4th, 2012
  - tests require CGI.pm 3.60 and HTTP::Date
  - fix typo

0.01  Sep 23rd, 2012
  - Forked from Blosxom::Header