Mercurial > epgrec.yaz
comparison Smarty/plugins/function.fetch.php @ 1:f5a9f0eb4858
deleted: LICENSE.ja
author | Sushi-k <epgrec@park.mda.or.jp> |
---|---|
date | Wed, 08 Jul 2009 11:44:50 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:96312e6ab8d4 | 1:f5a9f0eb4858 |
---|---|
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 */ | |
23 function 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 ?> |