Adding extra charsets for ActionMailer unit tests, if you're looking to parse incomin...
[akelos.git] / lib / AkHttpClient.php
blobc60b737b9197d5866be54b3cbf78feb927868047
1 <?php
4 class AkHttpClient extends AkObject
6 var $HttpRequest;
7 var $error;
8 var $Response;
10 function get($url, $options = array())
12 return $this->customRequest($url, 'GET', $options);
15 function post($url, $options = array(), $body = '')
17 return $this->customRequest($url, 'POST', $options, $body);
20 function put($url, $options = array(), $body = '')
22 return $this->customRequest($url, 'PUT', $options, $body);
25 function delete($url, $options = array())
27 return $this->customRequest($url, 'DELETE', $options);
30 // prefix_options, query_options = split_options(options)
32 function customRequest($url, $http_verb = 'GET', $options = array(), $body = '')
34 $this->getRequestInstance($url, $http_verb, $options, $body);
35 return $this->sendRequest();
38 function urlExists($url)
40 $this->getRequestInstance($url, 'GET');
41 $this->sendRequest(false);
42 return $this->code == 200;
45 function getRequestInstance($url, $http_verb = 'GET', $options = array(), $body = '')
47 $default_options = array(
48 'header' => array(),
49 'params' => array(),
52 $options = array_merge($default_options, $options);
54 $options['header']['user-agent'] = empty($options['header']['user-agent']) ?
55 'Akelos PHP Framework AkHttpClient (http://akelos.org)' : $options['header']['user-agent'];
57 list($user_name, $password) = $this->_extractUserNameAndPasswordFromUrl($url);
59 require_once(AK_VENDOR_DIR.DS.'pear'.DS.'HTTP'.DS.'Request.php');
61 $this->{'_setParamsFor'.ucfirst(strtolower($http_verb))}($url, $options['params']);
63 $this->HttpRequest =& new HTTP_Request($url);
65 $user_name ? $this->HttpRequest->setBasicAuth($user_name, $password) : null;
67 $this->HttpRequest->setMethod(constant('HTTP_REQUEST_METHOD_'.$http_verb));
69 $http_verb == 'PUT' && !empty($options['params']) && $this->setBody($options['params']);
71 !empty($options['params']) && $this->addParams($options['params']);
73 $this->addHeaders($options['header']);
75 return $this->HttpRequest;
78 function addHeaders($headers)
80 foreach ($headers as $k=>$v){
81 $this->addHeader($k, $v);
85 function addHeader($name, $value)
87 $this->HttpRequest->removeHeader($name);
88 $this->HttpRequest->addHeader($name, $value);
91 function getResponseHeader($name)
93 return $this->HttpRequest->getResponseHeader($name);
96 function getResponseHeaders()
98 return $this->HttpRequest->getResponseHeader();
101 function getResponseCode()
103 return $this->HttpRequest->getResponseCode();
106 function addParams($params = array())
108 if(!empty($params)){
109 foreach (array_keys($params) as $k){
110 $this->HttpRequest->addPostData($k, $params[$k]);
115 function setBody($body)
117 Ak::compat('http_build_query');
118 $this->HttpRequest->setBody(http_build_query((array)$body));
121 function sendRequest($return_body = true)
123 $this->Response = $this->HttpRequest->sendRequest();
124 $this->code = $this->HttpRequest->getResponseCode();
125 if (PEAR::isError($this->Response)) {
126 $this->error = $this->Response->getMessage();
127 return false;
128 } else {
129 return $return_body ? $this->HttpRequest->getResponseBody() : true;
133 function _extractUserNameAndPasswordFromUrl(&$url)
135 return array(null,null);
138 function getParamsOnUrl($url)
140 $parts = parse_url($url);
141 if($_tmp = (empty($parts['query']) ? false : $parts['query'])){
142 unset($parts['query']);
143 $url = $this->_httpRenderQuery($parts);
145 $result = array();
146 !empty($_tmp) && parse_str($_tmp, $result);
147 return $result;
150 function getUrlWithParams($url, $params)
152 $parts = parse_url($url);
153 Ak::compat('http_build_query');
154 $parts['query'] = http_build_query($params);
155 return $this->_httpRenderQuery($parts);
158 function _setParamsForGet(&$url, &$params)
160 $url_params = $this->getParamsOnUrl($url);
161 if(!count($url_params) && !empty($params)){
162 $url = $this->getUrlWithParams($url, $params);
163 }else{
164 $params = $url_params;
168 function _setParamsForPost(&$url, &$params)
170 empty($params) && $params = $this->getParamsOnUrl($url);
173 function _setParamsForPut(&$url, &$params)
175 empty($params) && $params = $this->getParamsOnUrl($url);
178 function _setParamsForDelete(&$url, &$params)
180 if(!$this->getParamsOnUrl($url) && !empty($params)){
181 $url = $this->getUrlWithParams($url, $params);
185 function _httpRenderQuery($parts)
187 return is_array($parts) ? (
188 (isset($parts['scheme']) ? $parts['scheme'].':'.((strtolower($parts['scheme']) == 'mailto') ? '' : '//') : '').
189 (isset($parts['user']) ? $parts['user'].(isset($parts['pass']) ? ':'.$parts['pass'] : '').'@' : '').
190 (isset($parts['host']) ? $parts['host'] : '').
191 (isset($parts['port']) ? ':'.$parts['port'] : '').
192 (isset($parts['path'])?((substr($parts['path'], 0, 1) == '/') ? $parts['path'] : ('/'.$parts['path'])):'').
193 (isset($parts['query']) ? '?'.$parts['query'] : '').
194 (isset($parts['fragment']) ? '#'.$parts['fragment'] : '')
195 ) : false;