From a3e477b1452303804f31c57fa9f7a2b21bff0c7c Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Fri, 22 Nov 2013 12:48:31 +0000 Subject: [PATCH] HttpUtils: 301 patches from Wolfgang, Boris & me git-svn-id: https://svn.fhem.de/fhem/trunk@4259 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/HttpUtils.pm | 45 +++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/fhem/FHEM/HttpUtils.pm b/fhem/FHEM/HttpUtils.pm index 54fede1a0..a689cd91c 100644 --- a/fhem/FHEM/HttpUtils.pm +++ b/fhem/FHEM/HttpUtils.pm @@ -69,13 +69,15 @@ CustomGetFileFromURL($$@) RETRY: my $displayurl= $quiet ? "" : $url; + Log3 undef, $loglevel, "CustomGetFileFromURL url=$displayurl"; if($url !~ /^(http|https):\/\/(([^:\/]+):([^:\/]+)@)?([^:\/]+)(:\d+)?(\/.*)$/) { Log3 undef, $loglevel, "CustomGetFileFromURL $displayurl: malformed or unsupported URL"; return undef; } - my ($protocol,$authstring,$user,$pwd,$host,$port,$path)= ($1,$2,$3,$4,$5,$6,$7); + my ($protocol,$authstring,$user,$pwd,$host,$port,$path) = + ($1,$2,$3,$4,$5,$6,$7); if(defined($port)) { $port =~ s/^://; @@ -86,7 +88,7 @@ CustomGetFileFromURL($$@) my $auth64; if(defined($authstring)) { - $auth64 = encode_base64("$user:$pwd",""); + $auth64 = encode_base64("$user:$pwd",""); } my $conn; @@ -103,8 +105,8 @@ CustomGetFileFromURL($$@) } $errstr= $@ if(!$conn); if(!$conn) { - Log3 undef, $loglevel, - "CustomGetFileFromURL $displayurl: Can't connect to $protocol://$host:$port, $errstr"; + Log3 undef, $loglevel, "CustomGetFileFromURL $displayurl: ". + "Can't connect to $protocol://$host:$port, $errstr"; undef $conn; return undef; } @@ -130,7 +132,8 @@ CustomGetFileFromURL($$@) vec($rin, $conn->fileno(), 1) = 1; my $nfound = select($rout=$rin, undef, undef, $timeout); if($nfound <= 0) { - Log3 undef, $loglevel, "CustomGetFileFromURL $displayurl: Select timeout/error: $!"; + Log3 undef, $loglevel, + "CustomGetFileFromURL $displayurl: Select timeout/error: $!"; undef $conn; return undef; } @@ -142,31 +145,33 @@ CustomGetFileFromURL($$@) $ret=~ s/(.*?)\r\n\r\n//s; # Not greedy: switch off the header. my @header= split("\r\n", $1); - my @header0= split(" ", $header[0]); + my @header0= split(" ", shift @header); my $code= $header0[1]; - Log3 undef, 4, "CustomGetFileFromURL $displayurl: Code $code ($header[0])"; - if($code==301) { - # redirect - my @header1= split(" ", $header[1]); - my $location= $header1[1]; - Log3 undef, 4, "CustomGetFileFromURL $displayurl: Redirect"; - - $redirects++; - if($redirects> 5) { - Log3 undef, 2, "CustomGetFileFromURL $displayurl: Too many redirects"; + Log3 undef, $loglevel, + "CustomGetFileFromURL $displayurl: HTTP Response code $code"; + + if($code == 301 || $code == 302 || $code == 303) { # redirect + if(++$redirects > 5) { + Log3 undef, $loglevel, + "CustomGetFileFromURL $displayurl: Too many redirects"; + } else { - $url= $location; + map { $url=$1 if($_ =~ m/Location:\s*(\S+)$/) } @header; + Log3 undef, $loglevel, "CustomGetFileFromURL $displayurl: ". + "Redirect to ".($quiet ? "" : $url); goto RETRY; + } } my $hostpath= $quiet ? "" : $host . $path; - Log3 undef, 4, + Log3 undef, $loglevel, "CustomGetFileFromURL $displayurl: Got data, length: ".length($ret); if(!length($ret)) { - Log3 undef, 4, "CustomGetFileFromURL $displayurl: Zero length data, header follows..."; + Log3 undef, $loglevel, + "CustomGetFileFromURL $displayurl: Zero length data, header follows..."; for (@header) { - Log3 undef, 4, "CustomGetFileFromURL $displayurl: $_"; + Log3 undef, $loglevel, "CustomGetFileFromURL $displayurl: $_"; } } undef $conn;