Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
33.33% covered (danger)
33.33%
1 / 3
CRAP
89.47% covered (warning)
89.47%
34 / 38
file_downloader
0.00% covered (danger)
0.00%
0 / 1
33.33% covered (danger)
33.33%
1 / 3
12.17
89.47% covered (warning)
89.47%
34 / 38
 get
0.00% covered (danger)
0.00%
0 / 1
10.06
91.67% covered (success)
91.67%
33 / 36
 get_error_string
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 get_error_number
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb;
class file_downloader
{
    /** @var string Error string */
    protected $error_string = '';
    /** @var int Error number */
    protected $error_number = 0;
    /**
     * Retrieve contents from remotely stored file
     *
     * @param string    $host            File host
     * @param string    $directory        Directory file is in
     * @param string    $filename        Filename of file to retrieve
     * @param int        $port            Port to connect to; default: 80
     * @param int        $timeout        Connection timeout in seconds; default: 6
     *
     * @return mixed File data as string if file can be read and there is no
     *            timeout, false if there were errors or the connection timed out
     *
     * @throws \phpbb\exception\runtime_exception If data can't be retrieved and no error
     *        message is returned
     */
    public function get($host, $directory, $filename, $port = 80, $timeout = 6)
    {
        // Set default values for error variables
        $this->error_number = 0;
        $this->error_string = '';
        if ($socket = @fsockopen(($port == 443 ? 'ssl://' : '') . $host, $port, $this->error_number, $this->error_string, $timeout))
        {
            @fputs($socket, "GET $directory/$filename HTTP/1.0\r\n");
            @fputs($socket, "HOST: $host\r\n");
            @fputs($socket, "Connection: close\r\n\r\n");
            $timer_stop = time() + $timeout;
            stream_set_timeout($socket, $timeout);
            $file_info = '';
            $get_info = false;
            while (!@feof($socket))
            {
                if ($get_info)
                {
                    $file_info .= @fread($socket, 1024);
                }
                else
                {
                    $line = @fgets($socket, 1024);
                    if ($line == "\r\n")
                    {
                        $get_info = true;
                    }
                    else if (stripos($line, '404 not found') !== false)
                    {
                        throw new \phpbb\exception\runtime_exception('FILE_NOT_FOUND', array($filename));
                    }
                }
                $stream_meta_data = stream_get_meta_data($socket);
                if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop)
                {
                    throw new \phpbb\exception\runtime_exception('FSOCK_TIMEOUT');
                }
            }
            @fclose($socket);
        }
        else
        {
            if ($this->error_string)
            {
                $this->error_string = utf8_convert_message($this->error_string);
                return false;
            }
            else
            {
                throw new \phpbb\exception\runtime_exception('FSOCK_DISABLED');
            }
        }
        return $file_info;
    }
    /**
     * Get error string
     *
     * @return string Error string
     */
    public function get_error_string()
    {
        return $this->error_string;
    }
    /**
     * Get error number
     *
     * @return int Error number
     */
    public function get_error_number()
    {
        return $this->error_number;
    }
}