TPAC: Avoid 500 errs on record page due to ipv6 ignorance
authorDan Scott <dscott@laurentian.ca>
Thu, 11 Oct 2012 02:06:32 +0000 (22:06 -0400)
committerBill Erickson <berick@esilibrary.com>
Thu, 11 Oct 2012 13:55:34 +0000 (09:55 -0400)
Net::HTTP does not handle ipv6 addresses properly, and is subject to
failing to return a request object if handed one (some systems seem to
prefer ipv6). This commit checks the value of the request object before
invoking any methods on it, and also short-circuits the AC lookup loop
if the host could not be resolved to avoid flooding the logs with
multiple "Unable to connect..." warnings.

If Net::HTTP grows ipv6 support, this commit can still stay in place and
the lookups will just start magically working.

Signed-off-by: Dan Scott <dscott@laurentian.ca>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm

index a70db54..4497c33 100644 (file)
@@ -439,11 +439,13 @@ sub added_content_stage1 {
     # and back in to reach the top-level virtualhost.
     my $ac_addr = $ENV{SERVER_ADDR};
     my $ac_host = $self->apache->hostname;
+    my $ac_failed = 0;
 
     $logger->info("tpac: added content connecting to $ac_addr / $ac_host");
 
     $ctx->{added_content} = {};
     for my $type (@$ac_types) {
+        last if $ac_failed;
         $ctx->{added_content}->{$type} = {content => ''};
         $ctx->{added_content}->{$type}->{status} = $key ? 3 : 2;
 
@@ -457,14 +459,15 @@ sub added_content_stage1 {
             # or very slow (routing problems).
 
             my $req = Net::HTTP::NB->new(Host => $ac_addr, Timeout => 1);
-            $req->host($self->apache->hostname);
-
             if (!$req) {
                 $logger->warn("Unable to connect to $ac_addr / $ac_host".
                     " for added content lookup for $key: $@");
+                $ac_failed = 1;
                 next;
             }
 
+            $req->host($self->apache->hostname);
+
             my $http_type = ($type eq $sel_type) ? 'GET' : 'HEAD';
             $req->write_request($http_type => "/opac/extras/ac/$type/html/" . uri_escape($key));
             $ctx->{added_content}->{$type}->{request} = $req;