[Dancer-users] Follow-up: extending the serializer

David Precious davidp at preshweb.co.uk
Thu Jun 9 21:07:35 CEST 2011

On Wednesday 08 June 2011 00:03:44 Mr. Puneet Kishor wrote:
> On Jun 7, 2011, at 4:51 PM, Mr. Puneet Kishor wrote:
> > I am trying to write a new serializer plugin called
> > `Dancer::Serializer::Tgz` modeled after Data::Dumper, JSON, etc. The
> > idea is that, in conjunction with `Dancer::Plugin::REST` and
> > `Dancer::Serializer::Mutable`, the user would be able to request data in
> > .tgz format on demand like so --
> > 
> > $ curl http://example.com/employees.tgz
> > 
> > Here is my baby code, and it gives me a rather unhelpful "an internal
> > error occurred". What am I doing wrong?
> After much fiddling, I was able to see the following errors --
> in my Apache error log, I get
> Deep recursion on subroutine "Dancer::Error::render" at ../Dancer.pm line
> 312. Deep recursion on subroutine "Dancer::Error::_render_serialized" at
> ../Dancer/Error.pm line 167. Deep recursion on subroutine
> "Dancer::Serializer::Tgz::serialize" at ../Dancer/Error.pm line 177. Deep
> recursion on subroutine "Dancer::_send_file" ../Dancer.pm line 140.

I suspect that the call to send_file() is generating an error of some sort - 
which gets passed to the serializer to serialize... recursion ahoy.
> If I uncomment the `sub content_type {'application/gzip'}` I also get
> Subroutine content_type redefined at ../Dancer/Serializer/Tgz.pm line 43.

Ah - you've got "use Dancer ':syntax';" before "use base 
'Dancer::Serializer::Abstract';", so Dancer has already exported the 
content_type() keyword into your package.

You can probably fix it with:

use Dancer qw(:syntax !content_type);

> Also, if I comment the `send_file` command in serialize(), I actually do
> get a result.tgz. If I untar that result.tgz, I see the following text
> {
>    "error" : "Serializer (Dancer::Serializer::Tgz) failed at serializing
> Dancer::Error=HASH(0x100a93008):\nencountered object
> 'Dancer::Error=HASH(0x100a93008)', but neither allow_blessed nor
> convert_blessed settings are enabled at (eval 71) line 153.\n" }
> What am I doing wrong?

For debugging, I'd have the serializer log what it's about to serialize; it 
seems there's an error somewhere, and it's received a Dancer::Error object, 
and tried to serialize it with to_json() which then complained that 
convert_blessed isn't enabled.

Or you could add a bit of code to special-case serialisation of D::E objects, 

if (ref $entity eq 'Dancer::Error') {
    $entity = { error => $entity->message };

That might reveal the real problem.

David Precious  ("bigpresh")

   "Programming is like sex. One mistake and you have to support
   it for the rest of your life". (Michael Sinz)

More information about the Dancer-users mailing list