/** * @param integer $size */ public static function setMaxSize($size) { self::$_maxSize = intval($size); }
/** * 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); }