Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions components/ILIAS/Badge/tests/TileViewTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

namespace ILIAS\Badge\test;

use Psr\Http\Message\ServerRequestInterface;
use ILIAS\DI\Container;
use ILIAS\HTTP\Services;
use GuzzleHttp\Psr7\ServerRequest;
use PHPUnit\Framework\TestCase;
use ILIAS\Badge\Tile;
use ILIAS\Badge\PresentationHeader;
Expand Down Expand Up @@ -53,7 +53,7 @@ public function testConstruct(): void

public function testShow(): void
{
$request = $this->getMockBuilder(ServerRequest::class)->disableOriginalConstructor()->getMock();
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getQueryParams')->willReturn([]);

$http = $this->getMockBuilder(Services::class)->disableOriginalConstructor()->getMock();
Expand Down
5 changes: 2 additions & 3 deletions components/ILIAS/CmiXapi/classes/XapiProxy/XapiProxy.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@

namespace XapiProxy;

use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\RequestInterface;

class XapiProxy extends XapiProxyPolyFill
{
Expand All @@ -34,7 +33,7 @@ public function __construct(string $client, string $token, ?bool $plugin = false
$this->log()->debug($this->msg('proxy initialized'));
}

public function setRequestParams(Request $request): void
public function setRequestParams(RequestInterface $request): void
{
preg_match(self::PARTS_REG, (string) $request->getUri(), $this->cmdParts);
}
Expand Down
102 changes: 66 additions & 36 deletions components/ILIAS/CmiXapi/classes/XapiProxy/XapiProxyRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,18 @@

namespace XapiProxy;

use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Uri;
use ILIAS\DI\Container;
use ILIAS\HTTP\Message\MessageFactory;
use Psr\Http\Message\ResponseInterface;

class XapiProxyRequest
{
private Container $dic;

private XapiProxy $xapiproxy;

private MessageFactory $messages;

private XapiProxyResponse $xapiProxyResponse;

private string $cmdPart2plus = "";
Expand All @@ -39,6 +41,7 @@ public function __construct(XapiProxy $xapiproxy)
{
$this->dic = $GLOBALS['DIC'];
$this->xapiproxy = $xapiproxy;
$this->messages = $this->dic->http()->messages();
$this->cmdPart2plus = "";
}

Expand Down Expand Up @@ -177,7 +180,7 @@ private function handlePostPutStatementsRequest(\Psr\Http\Message\RequestInterfa
}
try {
$body = $this->xapiproxy->modifyBody($body);
$req = new Request($request->getMethod(), $request->getUri(), $request->getHeaders(), $body);
$req = $this->messages->request($request->getMethod(), $request->getUri(), $request->getHeaders(), $body);
$this->handleProxy($req, $fakePostBody);
} catch (\Exception $e) {
$this->xapiproxy->log()->error($this->msg($e->getMessage()));
Expand Down Expand Up @@ -250,13 +253,13 @@ private function handleProxy(\Psr\Http\Message\RequestInterface $request, $fakeP
$body = $request->getBody()->getContents();

// Default request ausführen
$responseDefault = $this->sendCurlRequest($upstreamDefault, $authDefault, $request->getMethod(), $body);
$responseDefault = $this->sendCurlRequest($upstreamDefault, $authDefault, $request, $body);

// Falls Fallback definiert, zweites Ziel testen
$responseFallback = null;
if ($hasFallback) {
$upstreamFallback = $endpointFallback . $cmd;
$responseFallback = $this->sendCurlRequest($upstreamFallback, $authFallback, $request->getMethod(), $body);
$responseFallback = $this->sendCurlRequest($upstreamFallback, $authFallback, $request, $body);
}

// Reaktionen auswerten
Expand All @@ -280,15 +283,43 @@ private function handleProxy(\Psr\Http\Message\RequestInterface $request, $fakeP
}
}

private function sendCurlRequest(string $url, string $authHeader, string $method, string $body = ''): \GuzzleHttp\Psr7\Response
private function sendCurlRequest(string $url, string $authHeader, \Psr\Http\Message\RequestInterface $request, string $body = ''): ResponseInterface
{
$method = strtoupper($request->getMethod());
$ch = curl_init($url);
$headers = [
"Authorization: $authHeader",
"X-Experience-API-Version: 1.0.3",
"Accept: application/json",
"Content-Type: application/json"
// "X-Experience-API-Version: 1.0.3",
// "Accept: application/json",
// "Content-Type: application/json",
"Cache-Control: no-cache, no-store, must-revalidate",
"Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With",
"Pragma: no-cache",
];
if ($request->hasHeader('X-Experience-API-Version')) {
$headers[] = "X-Experience-API-Version: " . $request->getHeader('X-Experience-API-Version')[0];
}
if ($request->hasHeader('Origin')) {
$headers[] = "Origin: " . $request->getHeader('Origin')[0];
$headers[] = "Access-Control-Allow-Origin: " . $request->getHeader('Origin')[0];
$headers[] = "Content-Security-Policy: frame-ancestors 'self' " . $request->getHeader('Origin')[0];
}
if ($request->hasHeader('Referrer')) {
$headers[] = "Referrer: " . $request->getHeader('Referrer')[0];
}
if ($request->hasHeader('Connection')) {
$headers[] = "Connection: " . $request->getHeader('Connection')[0];
}
// if ($request->hasHeader('Content-Length')) {
// $contentLength = $request->getHeader('Content-Length');
// if (is_array($contentLength) && $contentLength[0] != '') {
// $headers[] = "Content-Length: " . $contentLength[0];
// }
// }
if ($request->hasHeader('Content-Type')) {
$headers[] = "Content-Type: " . $request->getHeader('Content-Type')[0];
$headers[] = "Accept: application/json";
}

curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
Expand All @@ -297,6 +328,7 @@ private function sendCurlRequest(string $url, string $authHeader, string $method
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_HTTPHEADER => $headers,
// CURLOPT_FAILONERROR => false,
CURLOPT_CUSTOMREQUEST => strtoupper($method),
]);

Expand All @@ -314,50 +346,48 @@ private function sendCurlRequest(string $url, string $authHeader, string $method
$rawBody = '';
}

return new \GuzzleHttp\Psr7\Response($statusCode, [], $rawBody);
}

private function createProxyRequest(\Psr\Http\Message\RequestInterface $request, \GuzzleHttp\Psr7\Uri $uri, string $auth, string $body): \GuzzleHttp\Psr7\Request
{
//Headers to send to content
$headers = array(
'Cache-Control' => 'no-cache, no-store, must-revalidate',
'Authorization' => $auth
'Content-Type' => "application/json",
'Accept' => "application/json"
);

if ($request->hasHeader('X-Experience-API-Version')) {
$headers['X-Experience-API-Version'] = $request->getHeader('X-Experience-API-Version');
}

if ($request->hasHeader('Referrer')) {
$headers['Referrer'] = $request->getHeader('Referrer');
}
// if ($request->hasHeader('Referrer')) {
// $headers['Referrer'] = $request->getHeader('Referrer');
// }

if ($request->hasHeader('Content-Type')) {
$headers['Content-Type'] = $request->getHeader('Content-Type');
}
// if ($request->hasHeader('Content-Type')) {
// $headers['Content-Type'] = $request->getHeader('Content-Type');
// }

if ($request->hasHeader('Origin')) {
$headers['Origin'] = $request->getHeader('Origin');
// $headers['Origin'] = $request->getHeader('Origin');
$headers['Access-Control-Allow-Origin'] = $request->getHeader('Origin');
//$headers["Content-Security-Policy"] = "frame-ancestors 'self' " . $request->getHeader('Origin')[0];
}

if ($request->hasHeader('Content-Length')) {
$contentLength = $request->getHeader('Content-Length');
if (is_array($contentLength) && $contentLength[0] === '') {
$contentLength = array(0);
} elseif ($contentLength === '') {
$contentLength = array(0);
}
$headers['Content-Length'] = $contentLength;
}
// if ($request->hasHeader('Content-Length')) {
// $contentLength = $request->getHeader('Content-Length');
// if (is_array($contentLength) && $contentLength[0] === '') {
// $contentLength = array(0);
// } elseif ($contentLength === '') {
// $contentLength = array(0);
// }
// $headers['Content-Length'] = $contentLength;
// }

if ($request->hasHeader('Connection')) {
$headers['Connection'] = $request->getHeader('Connection');
}
// if ($request->hasHeader('Connection')) {
// $headers['Connection'] = $request->getHeader('Connection');
// }

//$this->xapiproxy->log()->debug($this->msg($body));

$req = new Request(strtoupper($request->getMethod()), $uri, $headers, $body);

return $req;
return $this->messages->response($statusCode, $headers, $rawBody);
}
}
34 changes: 13 additions & 21 deletions components/ILIAS/CmiXapi/classes/XapiProxy/XapiProxyResponse.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,42 +22,34 @@

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\Request;
use ILIAS\HTTP\Message\MessageFactory;

class XapiProxyResponse
{
// private $dic;
private XapiProxy $xapiproxy;
//private $xapiProxyRequest;

public function __construct(XapiProxy $xapiproxy)
{
public function __construct(
XapiProxy $xapiproxy,
private MessageFactory $messages
) {
// $this->dic = $GLOBALS['DIC'];
$this->xapiproxy = $xapiproxy;
}

public function checkResponse(\GuzzleHttp\Psr7\Response $response, string $endpoint): bool
public function checkResponse(ResponseInterface $response, string $endpoint): bool
{
if ($response['state'] == 'fulfilled') {
$status = $response['value']->getStatusCode();
if ($status === 200 || $status === 204 || $status === 404) {
return true;
} else {
$this->xapiproxy->log()->error("LRS error {$endpoint}: " . $response['value']->getBody());
return false;
}
$status = $response->getStatusCode();
if ($status === 200 || $status === 204 || $status === 404) {
return true;
} else {
try {
$this->xapiproxy->log()->error("Connection error {$endpoint}: " . $response['reason']->getMessage());
} catch (\Exception $e) {
$this->xapiproxy->log()->error("error {$endpoint}:" . $e->getMessage());
}
$this->xapiproxy->log()->error("LRS error {$endpoint}: " . $response->getBody());
return false;
}
}

public function handleResponse(\Psr\Http\Message\RequestInterface $request, Response $response, array|string|null $fakePostBody = null): void
public function handleResponse(\Psr\Http\Message\RequestInterface $request, ResponseInterface $response, array|string|null $fakePostBody = null): void
{
// check transfer encoding bug
if ($fakePostBody !== null) {
Expand All @@ -75,7 +67,7 @@ public function handleResponse(\Psr\Http\Message\RequestInterface $request, Resp
$body = (string) $response->getBody();
unset($headers['Transfer-Encoding']);
$headers['Content-Length'] = array(strlen($body));
$response2 = new \GuzzleHttp\Psr7\Response($status, $headers, $body);
$response2 = $this->messages->response($status, $headers, $body);
$this->emit($response2);
} else {
$this->emit($response);
Expand Down Expand Up @@ -207,7 +199,7 @@ public function sendData(string $obj): void
exit;
}

public function emit(\GuzzleHttp\Psr7\Response $response): void
public function emit(ResponseInterface $response): void
{
$this->xapiproxy->log()->debug($this->msg('emitting response'));
if (headers_sent()) {
Expand Down
5 changes: 4 additions & 1 deletion components/ILIAS/CmiXapi/resources/xapiproxy.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@
require_once '../vendor/composer/vendor/autoload.php';
//instead of DataService
\ilContext::init(\ilContext::CONTEXT_SCORM);
require_once __DIR__ . '/../artifacts/bootstrap_default.php';
entry_point('ILIAS Legacy Initialisation Adapter');

ilInitialisation::initILIAS();
// DataService::initIlias($client);
$dic = $GLOBALS['DIC'];
Expand All @@ -76,7 +79,7 @@
$xapiproxy->log()->error($e->getMessage());
}
$req = new XapiProxyRequest($xapiproxy);
$resp = new XapiProxyResponse($xapiproxy);
$resp = new XapiProxyResponse($xapiproxy, $dic->http()->messages());

$xapiproxy->setXapiProxyRequest($req);
$xapiproxy->setXapiProxyResponse($resp);
Expand Down
3 changes: 2 additions & 1 deletion components/ILIAS/DI/tests/HTTPServicesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use ILIAS\HTTP\Services;
use ILIAS\HTTP\Request\RequestFactory;
use ILIAS\HTTP\Response\ResponseFactory;
use ILIAS\HTTP\Message\MessageFactory;
use ILIAS\HTTP\Response\Sender\ResponseSenderStrategy;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase as PHPUnitTestCase;
Expand Down Expand Up @@ -80,7 +81,7 @@ protected function setUp(): void

$this->mockDurationFactory = $this->createMock(DurationFactory::class);

$this->httpState = new RawHTTPServices($this->mockSenderStrategy, $this->mockCookieJarFactory, $this->mockRequestFactory, $this->mockResponseFactory, $this->mockDurationFactory);
$this->httpState = new RawHTTPServices($this->mockSenderStrategy, $this->mockCookieJarFactory, $this->mockRequestFactory, $this->mockResponseFactory, $this->mockDurationFactory, $this->createMock(MessageFactory::class));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

namespace ILIAS\Tests\FileDelivery\Delivery;

use GuzzleHttp\Psr7\Response;
use ILIAS\HTTP\Message\MessageFactoryImpl;
use ILIAS\FileDelivery\Delivery\BaseDelivery;
use ILIAS\FileDelivery\Delivery\Disposition;
use ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder;
Expand Down Expand Up @@ -138,7 +138,7 @@ public function testNotOnContentHostWhenRequestHitsIliasHost(): void
public function testNoIsolationHeadersWhenDisabled(): void
{
$delivery = $this->delivery(IsolationConfig::disabled());
$r = $delivery->exposedIsolationHeaders(new Response());
$r = $delivery->exposedIsolationHeaders((new MessageFactoryImpl())->response());

$this->assertFalse($r->hasHeader('X-Content-Type-Options'));
$this->assertFalse($r->hasHeader('Cross-Origin-Resource-Policy'));
Expand All @@ -149,7 +149,7 @@ public function testNoIsolationHeadersWhenDisabled(): void
public function testIsolationHeadersWhenActive(): void
{
$delivery = $this->delivery($this->activeConfig());
$r = $delivery->exposedIsolationHeaders(new Response());
$r = $delivery->exposedIsolationHeaders((new MessageFactoryImpl())->response());

$this->assertSame('nosniff', $r->getHeaderLine('X-Content-Type-Options'));
$this->assertSame('cross-origin', $r->getHeaderLine('Cross-Origin-Resource-Policy'));
Expand All @@ -161,7 +161,7 @@ public function testIsolationHeadersWhenActive(): void
public function testGeneralHeadersCarryIsolationHeadersWhenActive(): void
{
$delivery = $this->delivery($this->activeConfig());
$r = $delivery->exposedGeneralHeaders(new Response());
$r = $delivery->exposedGeneralHeaders((new MessageFactoryImpl())->response());

$this->assertSame('nosniff', $r->getHeaderLine('X-Content-Type-Options'));
$this->assertSame('cross-origin', $r->getHeaderLine('Cross-Origin-Resource-Policy'));
Expand All @@ -173,7 +173,7 @@ public function testGeneralHeadersCarryIsolationHeadersWhenActive(): void
public function testGeneralHeadersKeepTheirRegularContentHeaders(): void
{
$delivery = $this->delivery($this->activeConfig());
$r = $delivery->exposedGeneralHeaders(new Response());
$r = $delivery->exposedGeneralHeaders((new MessageFactoryImpl())->response());

$this->assertSame('text/plain', $r->getHeaderLine('Content-Type'));
$this->assertSame(
Expand All @@ -185,7 +185,7 @@ public function testGeneralHeadersKeepTheirRegularContentHeaders(): void
public function testGeneralHeadersCarryNoIsolationHeadersWhenDisabled(): void
{
$delivery = $this->delivery(IsolationConfig::disabled());
$r = $delivery->exposedGeneralHeaders(new Response());
$r = $delivery->exposedGeneralHeaders((new MessageFactoryImpl())->response());

$this->assertSame('text/plain', $r->getHeaderLine('Content-Type'));
$this->assertFalse($r->hasHeader('X-Content-Type-Options'));
Expand Down
Loading
Loading