/**
  * @param integer $size
  */
 public static function setMaxSize($size)
 {
     self::$_maxSize = intval($size);
 }
Exemplo n.º 2
0
 /**
  * Fetches the image at the specified URL using the standard proxy config.
  *
  * @param string $url
  *
  * @return array
  */
 protected function _fetchImageForProxy($url)
 {
     $urlHash = md5($url);
     $urlParts = parse_url($url);
     XenForo_ImageProxyStream::register();
     // convert kilobytes to bytes
     XenForo_ImageProxyStream::setMaxSize(XenForo_Application::getOptions()->imageProxyMaxSize * 1024);
     $streamUri = 'xf-image-proxy://' . $urlHash . '-' . uniqid();
     $streamFile = XenForo_ImageProxyStream::getTempFile($streamUri);
     $requestFailed = true;
     $error = false;
     $imageMeta = null;
     $fileName = !empty($urlParts['path']) ? basename($urlParts['path']) : '';
     $mimeType = '';
     $fileSize = 0;
     $image = false;
     $requestUrl = strtr($url, array(' ' => '+'));
     if (preg_match_all('/[^A-Za-z0-9._~:\\/?#\\[\\]@!$&\'()*+,;=%-]/', $requestUrl, $matches)) {
         foreach ($matches[0] as $match) {
             $requestUrl = str_replace($match[0], '%' . strtoupper(dechex(ord($match[0]))), $requestUrl);
         }
     }
     try {
         $response = XenForo_Helper_Http::getClient($requestUrl, array('output_stream' => $streamUri, 'timeout' => 10))->setHeaders('Accept-encoding', 'identity')->request('GET');
         if ($response->isSuccessful()) {
             $disposition = $response->getHeader('Content-Disposition');
             if (is_array($disposition)) {
                 $disposition = end($disposition);
             }
             if ($disposition && preg_match('/filename=(\'|"|)(.+)\\1/siU', $disposition, $match)) {
                 $fileName = $match[2];
             }
             if (!$fileName) {
                 $fileName = 'image';
             }
             $mimeHeader = $response->getHeader('Content-Type');
             if (is_array($mimeHeader)) {
                 $mimeHeader = end($mimeHeader);
             }
             $mimeType = $mimeHeader ? $mimeHeader : 'unknown/unknown';
             $imageMeta = XenForo_ImageProxyStream::getMetaData($streamUri);
             if (!empty($imageMeta['error'])) {
                 switch ($imageMeta['error']) {
                     case 'not_image':
                         $error = new XenForo_Phrase('file_not_an_image');
                         break;
                     case 'too_large':
                         $error = new XenForo_Phrase('file_is_too_large');
                         break;
                     case 'invalid_type':
                         $error = new XenForo_Phrase('image_is_invalid_type');
                         break;
                     default:
                         $error = $imageMeta['error'];
                 }
             } else {
                 $requestFailed = false;
                 $image = $imageMeta['image'];
                 $mimeType = $image['mime'];
                 $fileSize = $imageMeta['length'];
                 $extension = XenForo_Helper_File::getFileExtension($fileName);
                 $extensionMap = array(IMAGETYPE_GIF => array('gif'), IMAGETYPE_JPEG => array('jpg', 'jpeg', 'jpe'), IMAGETYPE_PNG => array('png'));
                 $validExtensions = $extensionMap[$image[2]];
                 if (!in_array($extension, $validExtensions)) {
                     $extensionStart = strrpos($fileName, '.');
                     $fileName = ($extensionStart ? substr($fileName, 0, $extensionStart) : $fileName) . '.' . $validExtensions[0];
                 }
             }
         } else {
             $error = new XenForo_Phrase('received_unexpected_response_code_x_message_y', array('code' => $response->getStatus(), 'message' => $response->getMessage()));
         }
     } catch (Exception $e) {
         $error = $e->getMessage();
         $response = null;
     }
     $response = null;
     return array('url' => $url, 'failed' => $requestFailed, 'error' => $error, 'image' => $image, 'fileName' => $fileName, 'mimeType' => $mimeType, 'fileSize' => $fileSize, 'tempFile' => $streamFile);
 }