source: pmb4.2/trunk/fuentes/pmb/classes/curl.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 9.2 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: curl.class.php,v 1.13.10.1 2015-09-11 08:53:13 jpermanne Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9/* Curl, CurlResponse
10#
11# Author Sean Huber - shuber@huberry.com
12# Date May 2008
13#
14# A basic CURL wrapper for PHP
15#
16# See the README for documentation/examples or http://php.net/curl for more information about the libcurl extension for PHP
17http://github.com/shuber/curl/tree/master/curl.php4
18*/
19       
20class Curl {
21        var $cookie_file;
22        var $headers = array();
23        var $options = array();
24        var $referer = '';
25        var $user_agent = '';
26        var $reponsecurl=array();
27        # Protected
28        var $error = '';
29        var $handle;
30        var $buffer="";
31       
32        # Variables qui empechent le dépassement mémoire
33        var $limit=0;   
34        var $body_overflow;
35        var $timeout=0;
36       
37        function __construct() {
38                // initialisation des libellés de réponse
39                $this->reponsecurl['N/A'] = "Ikke HTTP";
40                $this->reponsecurl[OK]    = "Valid hostname";
41                $this->reponsecurl[FEJL]  = "Invalid hostname";
42                $this->reponsecurl[Død]   = "No response";
43                $this->reponsecurl[100]   = "Continue";
44                $this->reponsecurl[101]   = "Switching Protocols";
45                $this->reponsecurl[200]   = "OK";
46                $this->reponsecurl[201]   = "Created";
47                $this->reponsecurl[202]   = "Accepted";
48                $this->reponsecurl[203]   = "Non-Authoritative Information";
49                $this->reponsecurl[204]   = "No Content";
50                $this->reponsecurl[205]   = "Reset Content";
51                $this->reponsecurl[206]   = "Partial Content";
52                $this->reponsecurl[300]   = "Multiple Choices";
53                $this->reponsecurl[301]   = "Moved Permanently";
54                $this->reponsecurl[302]   = "Found";
55                $this->reponsecurl[303]   = "See Other";
56                $this->reponsecurl[304]   = "Not Modified";
57                $this->reponsecurl[305]   = "Use Proxy";
58                $this->reponsecurl[307]   = "Temporary Redirect";
59                $this->reponsecurl[400]   = "Bad Request";
60                $this->reponsecurl[401]   = "Unauthorized";
61                $this->reponsecurl[402]   = "Payment Required";
62                $this->reponsecurl[403]   = "Forbidden";
63                $this->reponsecurl[404]   = "Not Found";
64                $this->reponsecurl[405]   = "Method Not Allowed";
65                $this->reponsecurl[406]   = "Not Acceptable";
66                $this->reponsecurl[407]   = "Proxy Authentication Required";
67                $this->reponsecurl[408]   = "Request Timeout";
68                $this->reponsecurl[409]   = "Conflict";
69                $this->reponsecurl[410]   = "Gone";
70                $this->reponsecurl[411]   = "Length Required";
71                $this->reponsecurl[412]   = "Precondition Failed";
72                $this->reponsecurl[413]   = "Request Entity Too Large";
73                $this->reponsecurl[414]   = "Request-URI Too Long";
74                $this->reponsecurl[415]   = "Unsupported Media Type";
75                $this->reponsecurl[416]   = "Requested Range Not Satisfiable";
76                $this->reponsecurl[417]   = "Expectation Failed";
77                $this->reponsecurl[500]   = "Internal Server Error";
78                $this->reponsecurl[501]   = "Not Implemented";
79                $this->reponsecurl[502]   = "Bad Gateway";
80                $this->reponsecurl[503]   = "Service Unavailable";
81                $this->reponsecurl[504]   = "Gateway Timeout";
82                $this->reponsecurl[505]   = "HTTP Version Not Supported";
83               
84                $this->cookie_file = realpath('.').'/curl_cookie.txt';
85                $this->user_agent = isset($_SERVER['HTTP_USER_AGENT']) ?
86                        $_SERVER['HTTP_USER_AGENT'] :
87                        'Curl/PHP ' . PHP_VERSION . ' (http://github.com/shuber/curl/)';
88        }
89         
90        function delete($url, $vars = array()) {
91                return $this->request('DELETE', $url, $vars);
92        }
93       
94        function error() {
95                return $this->error;
96        }
97       
98        function get($url, $vars = array()) {
99                $this->buffer="";
100                if (!empty($vars)) {
101                        $url .= (stripos($url, '?') !== false) ? '&' : '?';
102                        $url .= http_build_query($vars, '', '&');
103                }
104                return $this->request('GET', $url);
105        }
106       
107        function post($url, $vars = array()) {
108                return $this->request('POST', $url, $vars);
109        }
110       
111        function put($url, $vars = array()) {
112                return $this->request('PUT', $url, $vars);
113        }
114       
115        function getBodyOverflow($curl,$contenu) {
116                $taille_max  = $this->limit;
117                $taille_bloc = strlen($contenu);
118                if (strlen($this->body_overflow)+$taille_bloc<$taille_max) $this->body_overflow .= $contenu;   
119                return strlen($contenu);
120        }
121       
122        function saveBodyInFile($curl,$contenu) {
123                if(!$this->header_detect) {
124                        $this->buffer.=$contenu;
125                        $pattern = '#HTTP/\d\.\d.*?$.*?\r\n\r\n#ims';
126                        if (preg_match($pattern,$this->buffer)) {
127                                $texte = preg_replace($pattern, '', $this->buffer);
128                                $this->header_detect=1;
129                        }                       
130                } else $texte=$contenu;
131                if($texte) {
132                        $fd = fopen($this->save_file_name,"a");
133                        fwrite($fd,$texte);
134                        fclose($fd);   
135                }       
136                return strlen($contenu);
137        }
138       
139        /*function getHeader($curl,$contenu_header){
140                               
141                return strlen($contenu_header);
142        }*/
143       
144        # Protected
145        function request($method, $url, $vars = array()) {
146               
147                $this->handle = curl_init();
148               
149                # Set some default CURL options
150                if ($this->timeout) {
151                        curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, $this->timeout);
152                        curl_setopt($this->handle, CURLOPT_TIMEOUT, $this->timeout);
153                }
154                curl_setopt($this->handle, CURLOPT_COOKIEFILE, $this->cookie_file);
155                curl_setopt($this->handle, CURLOPT_COOKIEJAR, $this->cookie_file);
156                @curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, true);
157                curl_setopt($this->handle, CURLOPT_HEADER, true);
158                curl_setopt($this->handle, CURLOPT_POSTFIELDS, (is_array($vars) ? http_build_query($vars, '', '&') : $vars));
159                curl_setopt($this->handle, CURLOPT_REFERER, $this->referer);
160                curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, true);
161                curl_setopt($this->handle, CURLOPT_URL, str_replace(" ","%20",preg_replace("/#.*$/","",$url)));
162                /*On supprime ce qui suit le # car c'est une ancre pour le navigateur et avec on consière la validation fausse alors qu'elle est bonne
163                 *On remplace les espaces par %20 pour la même raison
164                 */
165                curl_setopt($this->handle, CURLOPT_USERAGENT, $this->user_agent);               
166                if($this->limit) 
167                        curl_setopt($this->handle, CURLOPT_WRITEFUNCTION,array(&$this,'getBodyOverflow'));
168               
169                if($this->save_file_name){
170                        $this->header_detect=0;                                 
171                        curl_setopt($this->handle, CURLOPT_WRITEFUNCTION,array(&$this,'saveBodyInFile'));
172                }       
173                configurer_proxy_curl($this->handle,str_replace(" ","%20",preg_replace("/#.*$/","",$url)));                     
174               
175                # Format custom headers for this request and set CURL option
176                $headers = array();
177                foreach ($this->headers as $key => $value) {
178                        $headers[] = $key.': '.$value;
179                }
180               
181                curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers);
182               
183                # Determine the request method and set the correct CURL option
184                switch ($method) {
185                        case 'GET':
186                                curl_setopt($this->handle, CURLOPT_HTTPGET, true);
187                                break;
188                        case 'POST':
189                                curl_setopt($this->handle, CURLOPT_POST, true);
190                                break;
191                        default:
192                                curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $method);
193                }
194               
195                # Set any custom CURL options
196                foreach ($this->options as $option => $value) {
197                        curl_setopt($this->handle, constant('CURLOPT_'.str_replace('CURLOPT_', '', strtoupper($option))), $value);
198                }
199
200                $this->body_overflow="";               
201                $response = curl_exec($this->handle);
202                if($this->limit) $response=$this->body_overflow;
203               
204                if ($response) {
205                        $response = new CurlResponse($response);
206                } else {
207                        $this->error = curl_errno($this->handle).' - '.curl_error($this->handle);
208                }
209                curl_close($this->handle);
210               
211                return $response;
212        }
213}
214 
215class CurlResponse {
216        var $body = '';
217        var $headers = array();
218       
219        function __construct($response) {
220                # Extract headers from response
221                $pattern = '#HTTP/\d\.\d.*?$.*?\r\n\r\n#ims';
222                preg_match_all($pattern, $response, $matches);
223                $headers = explode("\r\n", str_replace("\r\n\r\n", '', array_pop($matches[0])));
224               
225                # Extract the version and status from the first header
226                $version_and_status = array_shift($headers);
227                preg_match('#HTTP/(\d\.\d)\s(\d\d\d)\s(.*)#', $version_and_status, $matches);
228                $this->headers['Http-Version'] = $matches[1];
229                $this->headers['Status-Code'] = $matches[2];
230                $this->headers['Status'] = $matches[2].' '.$matches[3];
231               
232                # Convert headers into an associative array
233                foreach ($headers as $header) {
234                        preg_match('#(.*?)\:\s(.*)#', $header, $matches);
235                        $this->headers[$matches[1]] = $matches[2];
236                }
237               
238                # Remove the headers from the response body
239                $this->body = preg_replace($pattern, '', $response);
240        }
241       
242        function __toString() {
243                return $this->body;
244        }
245}
246 
247/**
248* http_build_query exists from PHP >= 5.0
249* If !function_exists then declare it.
250*/
251if(!function_exists('http_build_query')) {
252       
253        /**
254        * Generate URL-encoded query string.
255        * See http://php.net/http_build_query for more details.
256        *
257        * @param mixed $formdata
258        * @param string $numeric_prefix
259        * @param string $arg_separator
260        * @param string $key
261        * @return string
262        * @link http://php.net/http_build_query
263        */
264        function http_build_query($formdata, $numeric_prefix = null, $arg_separator = null, $key = null) {
265                $res = array();
266               
267                foreach ((array)$formdata as $k => $v) {
268                        $tmp_key = urlencode(is_int($k) ? $numeric_prefix.$k : $k);
269                        if ($key !== null) {
270                                $tmp_key = $key.'['.$tmp_key.']';
271                        }
272                        if (is_array($v) || is_object($v)) {
273                                $res[] = http_build_query($v, null, $arg_separator, $tmp_key);
274                        } else {
275                                $res[] = $tmp_key . "=" . urlencode($v);
276                        }
277                }
278               
279                if ($arg_separator === null) {
280                  $arg_separator = ini_get("arg_separator.output");
281                }
282               
283                return implode($arg_separator, $res);
284        }
285}
Note: See TracBrowser for help on using the repository browser.