source: trunk/workflow/inc/smarty/plugins/function.fetch.php @ 6057

Revision 6057, 8.6 KB checked in by marcosw, 12 years ago (diff)

Ticket #2398 - Compatibilizacao com PHP-5.3 em alguns módulos do expresso

  • Property svn:executable set to *
Line 
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 = preg_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'],preg_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?>
Note: See TracBrowser for help on using the repository browser.