webfactor
asked on
Curl request times out php
Hi everyone,
We r trying to make some api calls via curl and our last curl request times out for some reason.
Now we have a small chunk of code that sends an xml file to a seperate system via curl.
As far as we can tell the call code is corect but maybe there s something we r missing in our curl request options so i will paste the code.
Now here s the first part of code, where we just prep the required xml data and make the function call:
Theres a bit more code here but i think these r all the function that r used when making this call so i ll paste it all here in hope that someone will enlighten us.
Hope to hear from someone son and thank you for your help
We r trying to make some api calls via curl and our last curl request times out for some reason.
Now we have a small chunk of code that sends an xml file to a seperate system via curl.
As far as we can tell the call code is corect but maybe there s something we r missing in our curl request options so i will paste the code.
Now here s the first part of code, where we just prep the required xml data and make the function call:
$paymentXml='<Payments>
<Payment>
<Invoice>
<InvoiceNumber>'.$invoiceNumber.'</InvoiceNumber>
</Invoice>
<Account>
<AccountID>'.$xeroBankAcc.'</AccountID>
</Account>
<Date>'.date("Y-m-d").'T00:00:00</Date>
<Amount>'.$amt.'</Amount>
</Payment>
</Payments>';
//echo $paymentXml;
$response = $XeroOAuth->request('PUT', $XeroOAuth->url('Payments', 'core'), array(), $paymentXml);
if ($XeroOAuth->response['code'] == 200) {
$payment = $XeroOAuth->parseResponse($XeroOAuth->response['response'], $XeroOAuth->response['format']);
echo $payments;
} else {
outputError($XeroOAuth);
}//*/
}
The second part is from the wrapper library privided to us for using that specific api.Theres a bit more code here but i think these r all the function that r used when making this call so i ll paste it all here in hope that someone will enlighten us.
/**
* Makes a curl request. Takes no parameters as all should have been prepared
* by the request method
*
* @return void response data is stored in the class variable 'response'
*/
private function curlit()
{
// method handling
switch ($this->method) {
case 'POST':
break;
default:
// GET, DELETE request so convert the parameters to a querystring
if (!empty($this->request_params)) {
foreach ($this->request_params as $k => $v) {
// Multipart params haven't been encoded yet.
// Not sure why you would do a multipart GET but anyway, here's the support for it
if ($this->config['multipart']) {
$params[] = $k . '=' . $v;
} else {
$params[] = $this->safe_encode($k) . '=' . $this->safe_encode($v);
}
}
$qs = implode('&', $params);
$this->url = strlen($qs) > 0 ? $this->url . '?' . $qs : $this->url;
$this->request_params = array();
}
break;
}
// configure curl
$c = curl_init();
$useragent = (isset($this->config['user_agent'])) ? (empty($this->config['user_agent']) ? 'XeroOAuth-PHP' : $this->config['user_agent']) : 'XeroOAuth-PHP';
curl_setopt_array($c, array(
CURLOPT_USERAGENT => $useragent,
CURLOPT_CONNECTTIMEOUT => $this->config['curl_connecttimeout'],
CURLOPT_TIMEOUT => $this->config['curl_timeout'],
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_SSL_VERIFYPEER => $this->config['curl_ssl_verifypeer'],
CURLOPT_CAINFO => $this->config['curl_cainfo'],
CURLOPT_SSL_VERIFYHOST => $this->config['curl_ssl_verifyhost'],
CURLOPT_FOLLOWLOCATION => $this->config['curl_followlocation'],
CURLOPT_PROXY => $this->config['curl_proxy'],
CURLOPT_ENCODING => $this->config['curl_encoding'],
CURLOPT_URL => $this->sign['signed_url'],
CURLOPT_VERBOSE => $this->config['curl_verbose'],
// process the headers
CURLOPT_HEADERFUNCTION => array(
$this,
'curlHeader'
),
CURLOPT_HEADER => FALSE,
CURLINFO_HEADER_OUT => TRUE
));
if ($this->config['application_type'] == "Partner") {
curl_setopt_array($c, array(
// ssl client cert options for partner apps
CURLOPT_SSLCERT => $this->config['curl_ssl_cert'],
CURLOPT_SSLKEYPASSWD => $this->config['curl_ssl_password'],
CURLOPT_SSLKEY => $this->config['curl_ssl_key']
));
}
if ($this->config['curl_proxyuserpwd'] !== false)
curl_setopt($c, CURLOPT_PROXYUSERPWD, $this->config['curl_proxyuserpwd']);
if (isset($this->config['is_streaming'])) {
// process the body
$this->response['content-length'] = 0;
curl_setopt($c, CURLOPT_TIMEOUT, 0);
curl_setopt($c, CURLOPT_WRITEFUNCTION, array(
$this,
'curlWrite'
));
}
switch ($this->method) {
case 'GET':
$contentLength = 0;
break;
case 'POST':
curl_setopt($c, CURLOPT_POST, TRUE);
$post_body = $this->safe_encode($this->xml);
curl_setopt($c, CURLOPT_POSTFIELDS, $post_body);
$this->request_params['xml'] = $post_body;
$contentLength = strlen($post_body);
break;
case 'PUT':
$fh = fopen('php://memory', 'w+');
$put_body = $this->safe_encode($this->xml);
fwrite($fh, $put_body);
rewind($fh);
curl_setopt($c, CURLOPT_PUT, true);
curl_setopt($c, CURLOPT_INFILE, $fh);
curl_setopt($c, CURLOPT_INFILESIZE, strlen($put_body));
$contentLength = strlen($put_body);
break;
default:
curl_setopt($c, CURLOPT_CUSTOMREQUEST, $this->method);
}
if (!empty($this->request_params)) {
// if not doing multipart we need to implode the parameters
if (!$this->config['multipart']) {
foreach ($this->request_params as $k => $v) {
$ps[] = "{$k}={$v}";
}
$this->request_params = implode('&', $ps);
}
curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params);
} else {
// CURL will set length to -1 when there is no data
$this->headers['Content-Type'] = '';
$this->headers['Content-Length'] = $contentLength;
}
$this->headers['Expect'] = '';
if (!empty($this->headers)) {
foreach ($this->headers as $k => $v) {
$headers[] = trim($k . ': ' . $v);
}
curl_setopt($c, CURLOPT_HTTPHEADER, $headers);
}
if (isset($this->config['prevent_request']) && false == $this->config['prevent_request'])
return;
// do it!
$response = curl_exec($c);
if ($response === false) {
$response = 'Curl error: ' . curl_error($c);
$code = 1;
} else {
$code = curl_getinfo($c, CURLINFO_HTTP_CODE);
}
$info = curl_getinfo($c);
curl_close($c);
// store the response
$this->response['code'] = $code;
$this->response['response'] = $response;
$this->response['info'] = $info;
$this->response['format'] = $this->format;
return $code;
}
function MakeRequest($endpoint, $parameters, $action, $data, $app_type, $format = "xml")
{
$oauthObject = new OAuthSimple();
# Set some standard curl options....
$useragent = USER_AGENT;
$useragent = isset($useragent) ? USER_AGENT : 'XeroOAuth-PHP';
$options[CURLOPT_USERAGENT] = $useragent;
$options[CURLOPT_VERBOSE] = 1;
$options[CURLOPT_RETURNTRANSFER] = 1;
$options[CURLOPT_SSL_VERIFYHOST] = 0;
$options[CURLOPT_SSL_VERIFYPEER] = 0;
}
/**
* Make an HTTP request using this library. This method doesn't return anything.
* Instead the response should be inspected directly.
*
* @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc
* @param string $url the request URL without query string parameters
* @param array $params the request parameters as an array of key=value pairs
* @param string $format the format of the response. Default json. Set to an empty string to exclude the format
*/
function request($method, $url, $params = array(), $xml = "", $format = 'xml')
{
// removed these as function parameters for now
$useauth = true; $multipart = false;
if (isset($format)) {
switch ($format) {
case "pdf":
$this->headers['Accept'] = 'application/pdf';
break;
case "json":
$this->headers['Accept'] = 'application/json';
break;
case "xml":
default:
$this->headers['Accept'] = 'application/xml';
break;
}
}
if ($xml !== "")
$this->xml = $xml;
if($method == "POST")
$params['xml'] = $xml;
$this->prepare_method($method);
$this->config['multipart'] = $multipart;
$this->url = $url;
if (!isset($_REQUEST['order']))
$_REQUEST['order'] = "";
$oauthObject = new OAuthSimple();
try {
$this->sign = $oauthObject->sign(array(
'path' => $url,
'action' => $method,
'parameters' => array_merge($params, array(
'order' => urlencode($_REQUEST['order']),
'oauth_signature_method' => $this->config['signature_method']
)),
'signatures' => $this->config
));
}
catch (Exception $e) {
$errorMessage = $e->getMessage();
}
$this->format = $format;
$curlRequest = $this->curlit();
if ($this->response['code'] == 401 && isset($this->config['session_handle'])) {
if ((strpos($this->response['response'], "oauth_problem=token_expired") !== false)) {
$this->response['helper'] = "TokenExpired";
} else {
$this->response['helper'] = "TokenFatal";
}
}
if ($this->response['code'] == 403) {
$errorMessage = "It looks like your Xero Entrust cert issued by Xero is either invalid or has expired. See http://developer.xero.com/api-overview/http-response-codes/#403 for more";
// default IIS page isn't informative, a little swap
$this->response['response'] = $errorMessage;
$this->response['helper'] = "SetupIssue";
}
if ($this->response['code'] == 0) {
$errorMessage = "It looks like your Xero Entrust cert issued by Xero is either invalid or has expired. See http://developer.xero.com/api-overview/http-response-codes/#403 for more";
$this->response['response'] = $errorMessage;
$this->response['helper'] = "SetupIssue";
}
return $this->response;
}
Hope to hear from someone son and thank you for your help
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER