/framework/vendor/smarty2/lib/plugins/function.fetch.php
PHP | 221 lines | 31 code | 5 blank | 185 comment | 9 complexity | 51259f99b6554fa1a6a60013a5e7880a MD5 | raw file
1<?php 2/** 3 * Smarty plugin 4 * @package Smarty 5 * @subpackage plugins 6 */ 7 8 9/** 10 * Smarty {fetch} plugin 11 * 12 * Type: function<br> 13 * Name: fetch<br> 14 * Purpose: fetch file, web or ftp data and display results 15 * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} 16 * (Smarty online manual) 17 * @author Monte Ohrt <monte at ohrt dot com> 18 * @param array 19 * @param Smarty 20 * @return string|null if the assign parameter is passed, Smarty assigns the 21 * result to a template variable 22 */ 23function smarty_function_fetch($params, &$smarty) 24{ 25 if (empty($params['file'])) { 26 $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty"); 27 return; 28 } 29 30 $content = ''; 31 if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) { 32 $_params = array('resource_type' => 'file', 'resource_name' => $params['file']); 33 require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); 34 if(!smarty_core_is_secure($_params, $smarty)) { 35 $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed'); 36 return; 37 } 38 39 // fetch the file 40 if($fp = @fopen($params['file'],'r')) { 41 while(!feof($fp)) { 42 $content .= fgets ($fp,4096); 43 } 44 fclose($fp); 45 } else { 46 $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); 47 return; 48 } 49 } else { 50 // not a local file 51 if(preg_match('!^http://!i',$params['file'])) { 52 // http fetch 53 if($uri_parts = parse_url($params['file'])) { 54 // set defaults 55 $host = $server_name = $uri_parts['host']; 56 $timeout = 30; 57 $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; 58 $agent = "Smarty Template Engine ".$smarty->_version; 59 $referer = ""; 60 $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; 61 $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; 62 $_is_proxy = false; 63 if(empty($uri_parts['port'])) { 64 $port = 80; 65 } else { 66 $port = $uri_parts['port']; 67 } 68 if(!empty($uri_parts['user'])) { 69 $user = $uri_parts['user']; 70 } 71 if(!empty($uri_parts['pass'])) { 72 $pass = $uri_parts['pass']; 73 } 74 // loop through parameters, setup headers 75 foreach($params as $param_key => $param_value) { 76 switch($param_key) { 77 case "file": 78 case "assign": 79 case "assign_headers": 80 break; 81 case "user": 82 if(!empty($param_value)) { 83 $user = $param_value; 84 } 85 break; 86 case "pass": 87 if(!empty($param_value)) { 88 $pass = $param_value; 89 } 90 break; 91 case "accept": 92 if(!empty($param_value)) { 93 $accept = $param_value; 94 } 95 break; 96 case "header": 97 if(!empty($param_value)) { 98 if(!preg_match('![\w\d-]+: .+!',$param_value)) { 99 $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'"); 100 return; 101 } else { 102 $extra_headers[] = $param_value; 103 } 104 } 105 break; 106 case "proxy_host": 107 if(!empty($param_value)) { 108 $proxy_host = $param_value; 109 } 110 break; 111 case "proxy_port": 112 if(!preg_match('!\D!', $param_value)) { 113 $proxy_port = (int) $param_value; 114 } else { 115 $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); 116 return; 117 } 118 break; 119 case "agent": 120 if(!empty($param_value)) { 121 $agent = $param_value; 122 } 123 break; 124 case "referer": 125 if(!empty($param_value)) { 126 $referer = $param_value; 127 } 128 break; 129 case "timeout": 130 if(!preg_match('!\D!', $param_value)) { 131 $timeout = (int) $param_value; 132 } else { 133 $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); 134 return; 135 } 136 break; 137 default: 138 $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'"); 139 return; 140 } 141 } 142 if(!empty($proxy_host) && !empty($proxy_port)) { 143 $_is_proxy = true; 144 $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); 145 } else { 146 $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); 147 } 148 149 if(!$fp) { 150 $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)"); 151 return; 152 } else { 153 if($_is_proxy) { 154 fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); 155 } else { 156 fputs($fp, "GET $uri HTTP/1.0\r\n"); 157 } 158 if(!empty($host)) { 159 fputs($fp, "Host: $host\r\n"); 160 } 161 if(!empty($accept)) { 162 fputs($fp, "Accept: $accept\r\n"); 163 } 164 if(!empty($agent)) { 165 fputs($fp, "User-Agent: $agent\r\n"); 166 } 167 if(!empty($referer)) { 168 fputs($fp, "Referer: $referer\r\n"); 169 } 170 if(isset($extra_headers) && is_array($extra_headers)) { 171 foreach($extra_headers as $curr_header) { 172 fputs($fp, $curr_header."\r\n"); 173 } 174 } 175 if(!empty($user) && !empty($pass)) { 176 fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); 177 } 178 179 fputs($fp, "\r\n"); 180 while(!feof($fp)) { 181 $content .= fgets($fp,4096); 182 } 183 fclose($fp); 184 $csplit = split("\r\n\r\n",$content,2); 185 186 $content = $csplit[1]; 187 188 if(!empty($params['assign_headers'])) { 189 $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0])); 190 } 191 } 192 } else { 193 $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax"); 194 return; 195 } 196 } else { 197 // ftp fetch 198 if($fp = @fopen($params['file'],'r')) { 199 while(!feof($fp)) { 200 $content .= fgets ($fp,4096); 201 } 202 fclose($fp); 203 } else { 204 $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\''); 205 return; 206 } 207 } 208 209 } 210 211 212 if (!empty($params['assign'])) { 213 $smarty->assign($params['assign'],$content); 214 } else { 215 return $content; 216 } 217} 218 219/* vim: set expandtab: */ 220 221?>