]> git.wh0rd.org Git - tt-rss.git/commitdiff
Fix several problems with image download
authorAndrew Dolgov <fox@bah.org.ru>
Thu, 22 Apr 2010 06:10:49 +0000 (10:10 +0400)
committerAndrew Dolgov <fox@bah.org.ru>
Thu, 22 Apr 2010 06:10:49 +0000 (10:10 +0400)
Fix fetch_file_contents, so that it returns the contents even if the data isn't
an image. This is needed because the get_favicon_url function tries to download
the webpage using this function, to see if there is a favicon in the page.

The function now takes an optional $type parameter. This parameter control if
the calling function cares about the content-type, or if the function should
just return everything. If the $type parameter is set, the content-type should
contain the string contained in $type, otherwise the function returns false.

The second problem solved with this patch, is that the temporary file that
should contain the image was empty in some cases. I never found out why this
happended, but as curl_exec is capable of returning the fetched data, thus
eliminating the need for the temporary file all together, the function have
been changed to use this way of obtaining the data.

The last problem fixed by this patch is that curl will now follow redirects.

Author: Klaus S. Madsen <ksm@42.dk>

functions.php

index 78adfdbcbd153101f28b69ce6fad8df3e3215249..7320f0fac6f4c5f61b8832c6cb794d0c00a528e4 100644 (file)
                }
        }
 
-       function fetch_file_contents($url) {
+       function fetch_file_contents($url, $type) {
                if (USE_CURL_FOR_ICONS) {
-                       $tmpfile = tempnam(TMP_DIRECTORY, "ttrss-tmp");
-
                        $ch = curl_init($url);
-                       $fp = fopen($tmpfile, "w");
 
-                       if ($fp) {
-                               curl_setopt($ch, CURLOPT_FILE, $fp);
-                               curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
-                               curl_setopt($ch, CURLOPT_TIMEOUT, 45);
-                               curl_exec($ch);
-
-                               if (strpos(curl_getinfo($ch, CURLINFO_CONTENT_TYPE), "image/") !== false) {
-                                       curl_close($ch);
-                                       fclose($fp);                                    
-                                       $contents = file_get_contents($tmpfile);
-                               } else {
-                                       curl_close($ch);
-                                       fclose($fp);                                    
-                               }
+                       curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
+                       curl_setopt($ch, CURLOPT_TIMEOUT, 45);
+                       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+                       curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
+                       curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
+                       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+                       $contents = curl_exec($ch);
+                       if ($contents === false) {
+                               curl_close($ch);
+                               return false;
                        }
 
-                       unlink($tmpfile);
+                       $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
+                       curl_close($ch);
 
-                       return $contents;
+                       if ($type && strpos($content_type, "$type") === false) {
+                               return false;
+                       }
 
+                       return $contents;
                } else {
                        return file_get_contents($url);
                }
                $icon_file = ICONS_DIR . "/$feed.ico";
 
                if ($favicon_url && !file_exists($icon_file)) {
-                       $contents = fetch_file_contents($favicon_url);
+                       $contents = fetch_file_contents($favicon_url, "image");
 
-                       $fp = fopen($icon_file, "w");
+                       if ($contents) {
+                               $fp = fopen($icon_file, "w");
 
-                       if ($fp) {
-                               fwrite($fp, $contents);
-                               fclose($fp);
-                               chmod($icon_file, 0644);
+                               if ($fp) {
+                                       fwrite($fp, $contents);
+                                       fclose($fp);
+                                       chmod($icon_file, 0644);
+                               }
                        }
                }