128 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Zotlabs\Lib;
 | |
| 
 | |
| /**
 | |
|  * @brief wrapper for z_fetch_url() which can be instantiated with several built-in parameters and 
 | |
|  * these can be modified and re-used. Useful for CalDAV and other processes which need to authenticate
 | |
|  * and set lots of CURL options (many of which stay the same from one call to the next). 
 | |
|  */
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| class SuperCurl {
 | |
| 
 | |
| 	
 | |
|     private $auth;
 | |
|     private $url;
 | |
| 
 | |
| 	private $curlopt = array();
 | |
| 
 | |
| 	private $headers = null;
 | |
|     public $filepos = 0;
 | |
| 	public $filehandle = 0;
 | |
|     public $request_data = '';
 | |
| 
 | |
| 	private $request_method = 'GET';
 | |
| 	private $upload = false;
 | |
| 	private $cookies = false;
 | |
| 
 | |
| 
 | |
|     private function set_data($s) {
 | |
|         $this->request_data = $s;
 | |
|         $this->filepos = 0;
 | |
|     }
 | |
| 
 | |
|     public function curl_read($ch,$fh,$size) {
 | |
| 
 | |
|         if($this->filepos < 0) {
 | |
|             unset($fh);
 | |
|             return '';
 | |
|         }
 | |
| 
 | |
|         $s = substr($this->request_data,$this->filepos,$size);
 | |
| 
 | |
|         if(strlen($s) < $size)
 | |
|             $this->filepos = (-1);
 | |
|         else
 | |
|             $this->filepos = $this->filepos + $size;
 | |
| 
 | |
|         return $s;
 | |
|     }
 | |
| 
 | |
| 
 | |
| 	public function __construct($opts = array()) {
 | |
| 		$this->set($opts);
 | |
| 	}
 | |
| 
 | |
| 	private function set($opts = array()) {
 | |
| 		if($opts) {
 | |
| 			foreach($opts as $k => $v) {
 | |
| 				switch($k) {
 | |
| 					case 'http_auth':
 | |
| 						$this->auth = $v;
 | |
| 						break;
 | |
| 					case 'magicauth':
 | |
| 						// currently experimental
 | |
| 						$this->magicauth = $v;
 | |
| 						\Zotlabs\Daemon\Master::Summon([ 'CurlAuth', $v ]);
 | |
| 						break;
 | |
| 					case 'custom':
 | |
| 						$this->request_method = $v;
 | |
| 						break;
 | |
| 					case 'url':
 | |
| 						$this->url = $v;
 | |
| 						break;
 | |
| 					case 'data':
 | |
| 						$this->set_data($v);
 | |
| 						if($v) {
 | |
| 							$this->upload = true;
 | |
| 						}
 | |
| 						else {
 | |
| 							$this->upload = false;
 | |
| 						}							
 | |
| 						break;
 | |
| 					case 'headers':
 | |
| 						$this->headers = $v;
 | |
| 						break;
 | |
| 					default:
 | |
| 						$this->curlopts[$k] = $v;
 | |
| 						break;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function exec() {
 | |
| 		$opts = $this->curlopts;
 | |
| 		$url = $this->url;
 | |
| 		if($this->auth)
 | |
| 			$opts['http_auth'] = $this->auth;
 | |
| 		if($this->magicauth) {
 | |
| 			$opts['cookiejar']  = 'store/[data]/cookie_' . $this->magicauth;
 | |
| 			$opts['cookiefile'] = 'store/[data]/cookie_' . $this->magicauth;
 | |
| 			$opts['cookie'] = 'PHPSESSID=' . trim(file_get_contents('store/[data]/cookien_' . $this->magicauth));
 | |
| 			$c = channelx_by_n($this->magicauth);
 | |
| 			if($c)
 | |
| 				$url = zid($this->url,channel_reddress($c));
 | |
| 		}	
 | |
| 		if($this->custom)
 | |
| 			$opts['custom'] = $this->custom;
 | |
| 		if($this->headers)
 | |
| 			$opts['headers'] = $this->headers;
 | |
| 		if($this->upload) {
 | |
| 			$opts['upload'] = true;
 | |
| 			$opts['infile'] = $this->filehandle;
 | |
| 			$opts['infilesize'] = strlen($this->request_data);
 | |
| 			$opts['readfunc'] = [ $this, 'curl_read' ] ;
 | |
| 		}
 | |
| 
 | |
| 		$recurse = 0;
 | |
| 		return z_fetch_url($this->url,true,$recurse,(($opts) ? $opts : null)); 
 | |
| 		
 | |
| 	}
 | |
| 		
 | |
| 	
 | |
| }
 |