<?php
namespace IMSGlobal\LTI;
> global $CFG;
/**
> require_once($CFG->libdir . '/filelib.php');
* Class to represent an HTTP message
>
*
* @author Stephen P Vickers <svickers@imsglobal.org>
* @copyright IMS Global Learning Consortium Inc
* @date 2016
* @version 3.0.0
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
class HTTPMessage
{
/**
* True if message was sent successfully.
*
* @var boolean $ok
*/
public $ok = false;
/**
* Request body.
*
* @var request $request
*/
public $request = null;
/**
* Request headers.
*
* @var request_headers $requestHeaders
*/
public $requestHeaders = '';
/**
* Response body.
*
* @var response $response
*/
public $response = null;
/**
* Response headers.
*
* @var response_headers $responseHeaders
*/
public $responseHeaders = '';
/**
* Status of response (0 if undetermined).
*
* @var status $status
*/
public $status = 0;
/**
* Error message
*
* @var error $error
*/
public $error = '';
/**
* Request URL.
*
* @var url $url
*/
private $url = null;
/**
* Request method.
*
* @var method $method
*/
private $method = null;
/**
* Class constructor.
*
* @param string $url URL to send request to
* @param string $method Request method to use (optional, default is GET)
* @param mixed $params Associative array of parameter values to be passed or message body (optional, default is none)
* @param string $header Values to include in the request header (optional, default is none)
*/
function __construct($url, $method = 'GET', $params = null, $header = null)
{
$this->url = $url;
$this->method = strtoupper($method);
if (is_array($params)) {
$this->request = http_build_query($params);
} else {
$this->request = $params;
}
if (!empty($header)) {
$this->requestHeaders = explode("\n", $header);
}
}
/**
* Send the request to the target URL.
*
* @return boolean True if the request was successful
*/
public function send()
{
$this->ok = false;
// Try using curl if available
if (function_exists('curl_init')) {
$resp = '';
< $ch = curl_init();
< curl_setopt($ch, CURLOPT_URL, $this->url);
> $chResp = '';
>
> $curl = new \curl();
> $options = [
> 'CURLOPT_HEADER' => true,
> 'CURLINFO_HEADER_OUT' => true,
> ];
if (!empty($this->requestHeaders)) {
< curl_setopt($ch, CURLOPT_HTTPHEADER, $this->requestHeaders);
> $options['CURLOPT_HTTPHEADER'] = $this->requestHeaders;
} else {
< curl_setopt($ch, CURLOPT_HEADER, 0);
> $options['CURLOPT_HEADER'] = 0;
}
if ($this->method === 'POST') {
< curl_setopt($ch, CURLOPT_POST, true);
< curl_setopt($ch, CURLOPT_POSTFIELDS, $this->request);
> $chResp = $curl->post($this->url, $this->request, $options);
} else if ($this->method !== 'GET') {
< curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->method);
if (!is_null($this->request)) {
< curl_setopt($ch, CURLOPT_POSTFIELDS, $this->request);
> $chResp = $curl->post($this->url, $this->request, $options);
}
> } else {
}
> $chResp = $curl->get($this->url, null, $options);
< curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
< curl_setopt($ch, CURLINFO_HEADER_OUT, true);
< curl_setopt($ch, CURLOPT_HEADER, true);
< $chResp = curl_exec($ch);
< $this->ok = $chResp !== false;
< if ($this->ok) {
> $info = $curl->get_info();
>
> if (!$curl->get_errno() && !$curl->error) {
$chResp = str_replace("\r\n", "\n", $chResp);
$chRespSplit = explode("\n\n", $chResp, 2);
if ((count($chRespSplit) > 1) && (substr($chRespSplit[1], 0, 5) === 'HTTP/')) {
$chRespSplit = explode("\n\n", $chRespSplit[1], 2);
}
$this->responseHeaders = $chRespSplit[0];
$resp = $chRespSplit[1];
< $this->status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
> $this->status = $info['http_code'];
$this->ok = $this->status < 400;
if (!$this->ok) {
< $this->error = curl_error($ch);
> $this->error = $curl->error;
}
> } else {
}
> $this->error = $curl->error;
$this->requestHeaders = str_replace("\r\n", "\n", curl_getinfo($ch, CURLINFO_HEADER_OUT));
> $resp = $chResp;
< $this->requestHeaders = str_replace("\r\n", "\n", curl_getinfo($ch, CURLINFO_HEADER_OUT));
< curl_close($ch);
>
} else {
> $this->requestHeaders = !empty($info['request_header']) ? str_replace("\r\n", "\n", $info['request_header']) : '';
// Try using fopen if curl was not available
$opts = array('method' => $this->method,
'content' => $this->request
);
if (!empty($this->requestHeaders)) {
$opts['header'] = $this->requestHeaders;
}
try {
$ctx = stream_context_create(array('http' => $opts));
$fp = @fopen($this->url, 'rb', false, $ctx);
if ($fp) {
$resp = @stream_get_contents($fp);
$this->ok = $resp !== false;
}
} catch (\Exception $e) {
$this->ok = false;
}
}
return $this->ok;
}
}