library/SimplePie/File.php Quellcode

File.php
gehe zur Dokumentation dieser Datei
1 <?php
57 {
58  var $url;
60  var $success = true;
61  var $headers = array();
62  var $body;
64  var $redirects = 0;
65  var $error;
67 
68  public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
69  {
70  if (class_exists('idna_convert'))
71  {
72  $idn = new idna_convert();
74  $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
75  }
76  $this->url = $url;
77  $this->useragent = $useragent;
78  if (preg_match('/^http(s)?:\/\//i', $url))
79  {
80  if ($useragent === null)
81  {
82  $useragent = ini_get('user_agent');
83  $this->useragent = $useragent;
84  }
85  if (!is_array($headers))
86  {
87  $headers = array();
88  }
89  if (!$force_fsockopen && function_exists('curl_exec'))
90  {
92  $fp = curl_init();
93  $headers2 = array();
94  foreach ($headers as $key => $value)
95  {
96  $headers2[] = "$key: $value";
97  }
98  if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
99  {
100  curl_setopt($fp, CURLOPT_ENCODING, '');
101  }
102  curl_setopt($fp, CURLOPT_URL, $url);
103  curl_setopt($fp, CURLOPT_HEADER, 1);
104  curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
105  curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
106  curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
107  curl_setopt($fp, CURLOPT_REFERER, $url);
108  curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
109  curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
110  if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
111  {
112  curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
113  curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
114  }
115 
116  $this->headers = curl_exec($fp);
117  if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
118  {
119  curl_setopt($fp, CURLOPT_ENCODING, 'none');
120  $this->headers = curl_exec($fp);
121  }
122  if (curl_errno($fp))
123  {
124  $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
125  $this->success = false;
126  }
127  else
128  {
129  $info = curl_getinfo($fp);
130  curl_close($fp);
131  $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
132  $this->headers = array_pop($this->headers);
133  $parser = new SimplePie_HTTP_Parser($this->headers);
134  if ($parser->parse())
135  {
136  $this->headers = $parser->headers;
137  $this->body = $parser->body;
138  $this->status_code = $parser->status_code;
139  if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
140  {
141  $this->redirects++;
142  $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
143  return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
144  }
145  }
146  }
147  }
148  else
149  {
151  $url_parts = parse_url($url);
152  $socket_host = $url_parts['host'];
153  if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
154  {
155  $socket_host = "ssl://$url_parts[host]";
156  $url_parts['port'] = 443;
157  }
158  if (!isset($url_parts['port']))
159  {
160  $url_parts['port'] = 80;
161  }
162  $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
163  if (!$fp)
164  {
165  $this->error = 'fsockopen error: ' . $errstr;
166  $this->success = false;
167  }
168  else
169  {
170  stream_set_timeout($fp, $timeout);
171  if (isset($url_parts['path']))
172  {
173  if (isset($url_parts['query']))
174  {
175  $get = "$url_parts[path]?$url_parts[query]";
176  }
177  else
178  {
179  $get = $url_parts['path'];
180  }
181  }
182  else
183  {
184  $get = '/';
185  }
186  $out = "GET $get HTTP/1.1\r\n";
187  $out .= "Host: $url_parts[host]\r\n";
188  $out .= "User-Agent: $useragent\r\n";
189  if (extension_loaded('zlib'))
190  {
191  $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
192  }
193 
194  if (isset($url_parts['user']) && isset($url_parts['pass']))
195  {
196  $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
197  }
198  foreach ($headers as $key => $value)
199  {
200  $out .= "$key: $value\r\n";
201  }
202  $out .= "Connection: Close\r\n\r\n";
203  fwrite($fp, $out);
204 
205  $info = stream_get_meta_data($fp);
206 
207  $this->headers = '';
208  while (!$info['eof'] && !$info['timed_out'])
209  {
210  $this->headers .= fread($fp, 1160);
211  $info = stream_get_meta_data($fp);
212  }
213  if (!$info['timed_out'])
214  {
215  $parser = new SimplePie_HTTP_Parser($this->headers);
216  if ($parser->parse())
217  {
218  $this->headers = $parser->headers;
219  $this->body = $parser->body;
220  $this->status_code = $parser->status_code;
221  if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
222  {
223  $this->redirects++;
224  $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
225  return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
226  }
227  if (isset($this->headers['content-encoding']))
228  {
229  // Hey, we act dumb elsewhere, so let's do that here too
230  switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
231  {
232  case 'gzip':
233  case 'x-gzip':
234  $decoder = new SimplePie_gzdecode($this->body);
235  if (!$decoder->parse())
236  {
237  $this->error = 'Unable to decode HTTP "gzip" stream';
238  $this->success = false;
239  }
240  else
241  {
242  $this->body = $decoder->data;
243  }
244  break;
245 
246  case 'deflate':
247  if (($decompressed = gzinflate($this->body)) !== false)
248  {
249  $this->body = $decompressed;
250  }
251  else if (($decompressed = gzuncompress($this->body)) !== false)
252  {
253  $this->body = $decompressed;
254  }
255  else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false)
256  {
257  $this->body = $decompressed;
258  }
259  else
260  {
261  $this->error = 'Unable to decode HTTP "deflate" stream';
262  $this->success = false;
263  }
264  break;
265 
266  default:
267  $this->error = 'Unknown content coding';
268  $this->success = false;
269  }
270  }
271  }
272  }
273  else
274  {
275  $this->error = 'fsocket timed out';
276  $this->success = false;
277  }
278  fclose($fp);
279  }
280  }
281  }
282  else
283  {
285  if (!$this->body = file_get_contents($url))
286  {
287  $this->error = 'file_get_contents could not read the file';
288  $this->success = false;
289  }
290  }
291  }
292 }




Korrekturen, Hinweise und Ergänzungen

Bitte scheuen Sie sich nicht und melden Sie, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Support Forum wählen. Es ist eine kostenlose Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden kommentarlos entfernt.