[Catalyst] HTTP headers returned from GET vs HEAD
    Trevor Leffler 
    tleffler at uw.edu
       
    Wed Apr 23 23:44:03 GMT 2014
    
    
  
I've been playing with a toy application and inspecting its responses to 
various HTTP methods and noticed that Content-Length is missing from the 
HEAD response.  Both Catalyst::Action::RenderView and C::A::Serialize 
(from the C::A::REST package) seem to take the easy way out and "return 
1 if $c->req->method eq 'HEAD'".  Does anyone with CAR history know why 
this is?
To provide message-body-based headers (content-length, last-modified, 
content-md5, etc) I'm doing this:
sub render : ActionClass('RenderView') { }
sub end : Private {
   my $self = shift;
   my ($c) = @_;
   $c->forward('render');
   # see also Catalyst::Action::RenderView or ::Serialize
   if ($c->req->method eq 'HEAD') {
     my $view = $c->view
       || die sprintf("%s could not find a view to forward to.\n", 
__PACKAGE__);
     $c->forward($view);
   }
   # fun with headers, for example...
   # or enable P::M::ContentMD5
   if ($c->res->has_body) {
     my $md5 = Digest::MD5::md5_hex($c->res->body);
     $c->res->headers->header(Content-MD5 => $md5);
   }
}
I've noted that while $c->res->body now has my rendered view, it gets 
removed by Plack::Middleware::Head prior to returning the response, so I 
don't have to worry about that detail.
--Trevor
    
    
More information about the Catalyst
mailing list