Revision history for Perl extension CGI::Header. 0.63 (1.00-RC16) Aug 1st, 2013 - Merge CGI::Header::Extended into CGI::Header 0.62 (1.00-RC15) Jul 31st, 2013 - Add CGI::Header::Extended to examples/ 0.61 (1.00-RC14) Jun 16th, 2013 - Add the following modules to examples/: * Blosxom::Header * CGI::Application::Header * CGI::Redirect * CGI::Redirect::Adapter * MyApp::Header 0.60 (1.00-RC13) Jun 16th, 2013 - Add examples/ - mv lib/CGI/Header/Apache2.pm examples/lib/CGI/Header/Apache2.pm - CGI::Header::Apache2 isn't provided by this distribution. 0.59 (1.00-RC12) Jun 11th, 2013 - Remove CGI::Header#redirect and location 0.58 (1.00-RC11) Jun 5th, 2013 - CGI::Header::Apache2 updates request_rec->status_line properly 0.57 (1.00-RC10) Jun 1st, 2013 - CGI::Header::Standalone is separated into CGI::Header::Adapter and Apache2. Apache1 is not available at this time. 0.56 (1.00-RC9) May 31st, 2013 - finalize() prints to STDOUT using CGI#print [ROADMAP] CGI::Header::Standalone will be separated into CGI::Header::Apache1 and Apache2. For example, CGI::Header::Apache2 inherits from CGI::Header::Adapter which is a base class for adapters. 0.55 (1.00-RC8) May 22nd, 2013 - Add CGI::Header::Standalone again as the alternative to CGI::Header 0.54 (1.00-RC7) May 20th, 2013 - Rename CGI::Header#as_string to "finalize" since CGI.pm's header() method returns an empty string in "mod_perl" environment - Remove CGI::Header::Standalone 0.53 (1.00-RC6) May 19th, 2013 [DOCUMENTATION] - update EXAMPLES 0.52 (1.00-RC5) May 14th, 2013 - Add tests for CGI::Header#clone. POD explains how CGI::Header copies its instances. - CGI::Header::Standalone#as_string removes CRLF from Status-Line properly. - Tests require Test::MockTime (Thanks to CPAN Testers) 0.51 (1.00-RC4) May 13th, 2013 - Add CGI::Header::Standalone that doesn't depend on CGI.pm's header() method - Add clone() method to CGI::Header 0.50 (1.00-RC3) Apr 23rd, 2013 - Tests don't depend on Test::Exception (Thanks to CPAN testers) 0.49 (RC-1.00) Apr 22nd, 2013 - Remove rehash(). new() normalizes property names automatically. 0.48 (RC-1.00) Apr 20th, 2013 - Add EXAMPLES to POD - Add tests for EXAMPLES - Tests require CGI::Simple - Release candidate for CGI::Header 1.00 (RC-1.00) 0.47 Apr 12th, 2013 - Remove handler() and add redirect() instead - Rename cookie() to cookies() since the "cookie" property can be an arrayref - Remove push_cookie(). It's up to you to decide how to manage HTTP cookies. For example, Plack::Response#cookies behaves like HASH. On the other hand, Mojo::Message::Response#cookies behaves like ARRAY. 0.46 Apr 11th, 2013 - Remove CGI::Header::PSGI from this distribution. Sorry for confusing changes. - Simplify cookie() and p3p() - push_cookie() creates CGI::Cookie object automatically 0.45 Apr 10th, 2013 - Add CGI::Header::PSGI to this distribution and rewrite the module entirely. [INCOMPATIBLE CHANGES] - Rewrite test suite entirely - Remove flatten() and as_hashref() from CGI::Header 0.44 Apr 9th, 2013 [INCOMPATIBLE CHANGES] - Revise new() entirely 0.43 Apr 8th, 2013 [INCOMPATIBLE CHANGES] - Remove dispatch tables used by set() and delete() - Remove tie() interface 0.42 Apr 8th, 2013 - Add handler() attribute which defaults to 'header'. If handler() is set to 'redirect', as_string() will invoke: $h->query->redirect( $h->header ) [INCOMPATIBLE CHANGES] - Remove CGI::Header::Redirect and t/31_cgi_redirect.t - Remove t/32_nph_pragma.t - Remove push_p3p() 0.41 Apr 8th, 2013 - CGI::Header::Redirect is obsolete and will be removed in 0.42 [INCOMPATIBLE CHANGES] - Simplify get() and exists(). Namely, $h->get('Content-Type'); $h->exists('Content-Type'); become: $h->as_hashref->{'Conetent-Type'}; exists $h->as_hashref->{'Content-Type'}; - Remove the following methods: * is_empty * field_names * is_empty * SCALAR * p3p_tags - Normalized property names doesn't start with a dash, and also use dashes instead of underscores: "-Content_Length" -> "content-length" [ROADMAP] Dispatch tables used by get(), set(), exists() and delete() will be removed gradually, and so ver. 0.4x will be quite unstable. Sorry for your inconvenience. 0.40 Apr 7th, 2013 - field_names() is obsolete and will be removed in 0.41 - Add as_hashref(). get() and exists() will be replaced with this method: $h->get('Content-Type'); # <=> $h->as_hashref->{'Content-Type'} $h->exists('Content-Type'); # <=> exists $h->as_hashref->{'Content-Type'} - p3p_tags() is obsolete and will be renamed to p3p() in 0.41 - each() is obsolete and will be removed in 0.41 - is_empty() is obsolete and will be removed in 0.41 - Add the following methods: * charset * cookie * location * push_cookie * push_p3p * status * target * type [INCOMPATIBLE CHANGES] - Doesn't overload '""' and 'bool' anymore - flatten() doesn't accept any argument 0.35 Mar 22nd, 2013 - lc() is obsolete and will be removed in 0.36 - get(), set(), exists() or delete() throws an exception in the following situation: $header->set( 'Type' => 'text/plain' ); # die "'-type' can't be used as a field name" - SCALAR returns true if the -nph pragma is enabled - Since the following class methods are unstable, they are not documented: * normalize_field_name * normalize_property_name * get_property_names * is_reserved_name * get_alias 0.34 Mar 16th, 2013 - Add support for -nph pragma: use CGI qw(-nph); my $h = CGI::Header->new; $h->nph; # => true If -nph pragma is enabled, you can't set nph() to FALSE: $h->nph(0); # die "Modification of a read-only value attempted" You can check whether the pragma is enabled or not as follows: $h->query->nph; # <=> $CGI::NPH You can also set $CGI::NPH to FALSE: $h->query->nph(0); $h->nph(0); # lives_ok 0.33 Mar 15th, 2013 - Add tests for CGI::Header::Redirect - Fix POD: "CGI::Header::Redirect#is_empty always returns false" - Update dispatch tables to maintain this module more easily - Add the following class methods: * time2str * normalize 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