moved the new redirect test to a place where it doesnt cause warnings
John Napiorkowski [Tue, 25 Nov 2014 23:14:35 +0000 (17:14 -0600)]
Changes
lib/Catalyst.pm
lib/Catalyst/Response.pm
t/utf_incoming.t

diff --git a/Changes b/Changes
index 0165821..619653c 100644 (file)
--- a/Changes
+++ b/Changes
   - lots of UTF8 changes.  Again we think this is now more correct but please test.
   - Allow $c->res->redirect($url) to accept $url as an object that does ->as_string
     which I think will ease a common case (and common bug) and added documentation.
+  - UTF-8 is now the default encoding (there used to be none...).  You can disable
+    this if you need to with MyApp->config(encoding => undef) if it causes you trouble.
+  - Calling $c->res->write($data) now encodes $data based on the configured encoding
+    (UTF-8 is default).
 
 5.90077 - 2014-11-18
   - We store the PSGI $env in Catalyst::Engine for backcompat reasons.  Changed
index ddc77f6..eaf9581 100644 (file)
@@ -2037,7 +2037,10 @@ sub finalize_headers {
 
 =head2 $c->finalize_encoding
 
-Make sure your headers and body are encoded properly IF you set an encoding.
+Make sure your headers and body are encoded properly IF you set an encoding.  By
+default the encoding is UTF-8 but you can disable it by explictly setting the
+encoding configuration value to undef.
+
 See L</ENCODING>.
 
 =cut
@@ -3061,9 +3064,14 @@ Sets up the input/output encoding.  See L<ENCODING>
 
 sub setup_encoding {
     my $c = shift;
-    # This is where you'd set a default encoding
-    my $enc = delete $c->config->{encoding};
-    $c->encoding( $enc ) if defined $enc;
+    if( exists($c->config->{encoding}) && !defined($c->config->{encoding}) ) {
+        # Ok, so the user has explicitly said "I don't want encoding..."
+        return;
+    } else {
+      my $enc = defined($c->config->{encoding}) ?
+        delete $c->config->{encoding} : 'UTF-8'; # not sure why we delete it... (JNAP)
+      $c->encoding($enc);
+    }
 }
 
 =head2 handle_unicode_encoding_exception
@@ -3619,6 +3627,9 @@ C<using_frontend_proxy> - See L</PROXY SUPPORT>.
 
 C<encoding> - See L</ENCODING>
 
+This now defaults to 'UTF-8'.  You my turn it off by setting this configuration
+value to undef.
+
 =item *
 
 C<abort_chain_on_error_fix>
@@ -3964,6 +3975,9 @@ Please see L<PSGI> for more on middleware.
 On request, decodes all params from encoding into a sequence of
 logical characters. On response, encodes body into encoding.
 
+By default encoding is now 'UTF-8'.  You may turn it off by setting
+the encoding configuration to undef.
+
 =head2 Methods
 
 =over 4
index 7368a66..e53f30d 100644 (file)
@@ -103,6 +103,7 @@ sub write {
     $self->_context->finalize_headers unless $self->finalized_headers;
 
     $buffer = q[] unless defined $buffer;
+    $buffer = $self->_context->encoding->encode( $buffer, $self->_context->_encode_check );
 
     my $len = length($buffer);
     $self->_writer->write($buffer);
@@ -391,7 +392,20 @@ $res->code is an alias for this, to match HTTP::Response->code.
 
 =head2 $res->write( $data )
 
-Writes $data to the output stream.
+Writes $data to the output stream.  Calling this method will finalize your
+headers and send the headers and status code response to the client (so changing
+them afterwards is a waste... be sure to set your headers correctly first).
+
+You may call this as often as you want throughout your response cycle.  You may
+even set a 'body' afterward.  So for example you might write your HTTP headers
+and the HEAD section of your document and then set the body from a template
+driven from a database.  In some cases this can seem to the client as if you had
+a faster overall response (but note that unless your server support chunked
+body your content is likely to get queued anyway (L<Starman> and most other 
+http 1.1 webservers support this).
+
+If there is an encoding set, we encode each line of the response (the default
+encoding is UTF-8).
 
 =head2 $res->write_fh
 
@@ -427,6 +441,10 @@ example (assuming you are using a supporting server, like L<Twiggy>
         });
     }
 
+Like the 'write' method, calling this will finalize headers. Unlike 'write' when you
+can this it is assumed you are taking control of the response so the body is never
+finalized (there isn't one anyway) and you need to call the close method.
+
 =head2 $res->print( @data )
 
 Prints @data to the output stream, separated by $,.  This lets you pass
index 920a064..ea621ce 100644 (file)
@@ -61,8 +61,19 @@ use HTTP::Request::Common;
         Test::More::is $c->req->captures->[0], '♥';
 
         $c->response->body("<p>This is base-link action ♥ ${\$c->req->args->[0]}</p>");
+
+        # Test to make sure redirect can now take an object (sorry don't have a better place for it
+        # but wanted test coverage.
+        my $location = $c->res->redirect( $c->uri_for($c->controller('Root')->action_for('uri_for')) );
+        Test::More::ok !ref $location; 
       }
 
+  sub stream_write :Local {
+    my ($self, $c) = @_;
+    $c->response->content_type('text/html');
+    $c->response->write("<p>This is stream_write action ♥</p>");
+  }
+
   package MyApp;
   use Catalyst;
 
@@ -142,7 +153,6 @@ use Encode 2.21 'decode_utf8', 'encode_utf8';
 {
   my $res = request "/base/♥/♥/♥/♥";
 
-  is $res->code, 200, 'OK';
   is decode_utf8($res->content), '<p>This is base-link action ♥ ♥</p>', 'correct body';
   is $res->content_length, 39, 'correct length';
 }
@@ -172,11 +182,14 @@ use Encode 2.21 'decode_utf8', 'encode_utf8';
   is decode_utf8($res->content), "$url", 'correct body'; #should do nothing
   is $res->content, "$url", 'correct body';
   is $res->content_length, 90, 'correct length';
+}
+
+{
+  my $res = request "/root/stream_write";
 
-  # Test to make sure redirect can now take an object (sorry don't have a better place for it
-  # but wanted test coverage.
-  my $location = $c->res->redirect( $c->uri_for($c->controller('Root')->action_for('uri_for')) );
-  ok !ref $location; 
+  is $res->code, 200, 'OK';
+  is decode_utf8($res->content), '<p>This is stream_write action ♥</p>', 'correct body';
 }
 
+
 done_testing;