17 define(
'WEBSERVICE_RETRIES', 2);
18 define(
'WEBSERVICE_MICROSECONDS_BEFORE_RETRY', 100000);
20 define(
'WEBSERVICE_RESPONSE_OK', 200);
21 define(
'WEBSERVICE_RESPONSE_CREATED', 201);
23 import(
'lib.pkp.classes.webservice.WebServiceRequest');
44 $this->_authUsername = str_replace(
':',
'', $authUsername);
52 $this->_authPassword = $authPassword;
60 $this->_sslVersion = $sslVersion;
80 function &
call(&$webServiceRequest) {
81 assert(is_a($webServiceRequest,
'WebServiceRequest'));
84 switch($webServiceRequest->getMethod()) {
88 if ($webServiceRequest->getAsync()) {
106 if (!$result)
return $nullVar;
108 if ($this->_lastResponseStatus >= 400 && $this->_lastResponseStatus <= 599) {
113 $result = stripslashes($result);
129 $url = $webServiceRequest->getUrl();
130 $postOptions = $webServiceRequest->getParams();
132 $useProxySettings = $webServiceRequest->getUseProxySettings();
134 import(
'lib.pkp.classes.helpers.PKPCurlHelper');
137 $headers = array(
'Accept: ' . $webServiceRequest->getAccept());
138 foreach($webServiceRequest->getHeaders() as $header => $content) {
139 $headers[] = $header .
': ' . $content;
142 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
143 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
145 curl_setopt($ch, CURLOPT_CUSTOMREQUEST,
'PUT');
147 curl_setopt($ch, CURLOPT_POST, 1);
151 if (is_array($postOptions))
foreach ($postOptions as $paramValue) {
152 if ($paramValue[0] ==
'@') die(
'CURL parameters may not begin with @.');
155 curl_setopt($ch, CURLOPT_POSTFIELDS, $postOptions);
162 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
165 for ($retries = 0; $retries < WEBSERVICE_RETRIES; $retries++) {
166 if (($result = @curl_exec($ch)) !==
false)
break;
169 usleep(WEBSERVICE_MICROSECONDS_BEFORE_RETRY);
171 if (curl_errno($ch)) {
172 trigger_error(curl_error($ch), E_USER_ERROR);
175 $this->_lastResponseStatus = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
188 $url = $webServiceRequest->getUrl();
190 foreach($webServiceRequest->getParams() as $key => $values) {
192 if (is_scalar($values)) $values = array($values);
193 foreach($values as $value) {
194 if (empty($queryString)) {
199 $queryString .= urlencode($key).
'='.urlencode($value);
202 $url = $url.$queryString;
204 $useProxySettings = $webServiceRequest->getUseProxySettings();
206 import(
'lib.pkp.classes.helpers.PKPCurlHelper');
210 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
211 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
218 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
221 for ($retries = 0; $retries < WEBSERVICE_RETRIES; $retries++) {
222 if (($result = @curl_exec($ch)) !==
false)
break;
225 usleep(WEBSERVICE_MICROSECONDS_BEFORE_RETRY);
227 if (curl_errno($ch)) {
228 trigger_error(curl_error($ch), E_USER_ERROR);
231 $this->_lastResponseStatus = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
252 $url = $webServiceRequest->getUrl();
253 $urlParts = parse_url($url);
257 if (!is_null($username)) {
259 $webServiceRequest->setHeader(
'Authorization',
'Basic ' . base64_encode(
"$username:$password"));
263 if (!$webServiceRequest->hasHeader(
'Content-Type')) {
265 $webServiceRequest->setHeader(
'Content-Type',
'text/xml; charset=utf-8');
270 $payload = $webServiceRequest->getParams();
271 assert(is_string($payload));
276 isset($urlParts[
'port'])?$urlParts[
'port']:80,
283 $path = $urlParts[
'path'] . (isset($urlParts[
'query']) ?
'?' . $urlParts[
'query'] :
'');
284 $host = $urlParts[
'host'] .
':' . (isset($urlParts[
'port']) ? $urlParts[
'port'] :
'80');
285 $out = ($usePut ?
"PUT " :
"POST ") . $path .
" HTTP/1.1\r\n";
286 $out.=
"Host: " . $host .
"\r\n";
287 foreach ($headers as $header) {
288 $out.=
"$header\r\n";
290 $out.=
"Content-Length: " . strlen($payload) .
"\r\n";
291 $out.=
"Connection: Close\r\n\r\n";
310 if (!is_null($username)) {
312 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
313 curl_setopt($ch, CURLOPT_USERPWD,
"$username:$password");
323 if (substr($url, 0, 6) ==
'https:') {
324 $sslVersion = isset($this->_sslVersion) ? $this->_sslVersion : CURL_SSLVERSION_DEFAULT;
325 curl_setopt($ch, CURLOPT_SSLVERSION, $sslVersion);
337 $headers = array(
'Accept: ' . $webServiceRequest->getAccept());
338 foreach($webServiceRequest->getHeaders() as $header => $content) {
340 $header = str_replace(array(
' ',
':'), array(
'',
''), $header);
341 $headerLine = $header .
': ' . $content;
344 $headerLine = str_replace(array(
"\n",
"\r"), array(
'',
''), $headerLine);
345 $headers[] = $headerLine;