Skip to content
Merged
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
6 changes: 3 additions & 3 deletions src/Factory/DefaultFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
use Mougrim\XdebugProxy\Handler\IdeHandler;
use Mougrim\XdebugProxy\Handler\XdebugHandler;
use Mougrim\XdebugProxy\Proxy;
use Mougrim\XdebugProxy\RequestPreparer;
use Mougrim\XdebugProxy\RequestPreparer\RequestPreparer;
use Mougrim\XdebugProxy\Xml\DomXmlConverter;
use Mougrim\XdebugProxy\Xml\XmlConverter;
use Psr\Log\LoggerInterface;
Expand Down Expand Up @@ -41,9 +41,9 @@ public function createIdeHandler(LoggerInterface $logger, XmlConverter $xmlConve
}

/**
* @return RequestPreparer[]
* {@inheritdoc}
*/
public function createRequestPreparers(): array
public function createRequestPreparers(LoggerInterface $logger): array
{
return [];
}
Expand Down
11 changes: 9 additions & 2 deletions src/Factory/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
use Mougrim\XdebugProxy\Handler\IdeHandler;
use Mougrim\XdebugProxy\Handler\XdebugHandler;
use Mougrim\XdebugProxy\Proxy;
use Mougrim\XdebugProxy\RequestPreparer;
use Mougrim\XdebugProxy\RequestPreparer\Error as RequestPreparerError;
use Mougrim\XdebugProxy\RequestPreparer\Exception as RequestPreparerException;
use Mougrim\XdebugProxy\RequestPreparer\RequestPreparer;
use Mougrim\XdebugProxy\Xml\XmlConverter;
use Psr\Log\LoggerInterface;

Expand All @@ -33,9 +35,14 @@ public function createIdeHandler(
): IdeHandler;

/**
* @param LoggerInterface $logger
*
* @throws RequestPreparerException
* @throws RequestPreparerError
*
* @return RequestPreparer[]
*/
public function createRequestPreparers(): array;
public function createRequestPreparers(LoggerInterface $logger): array;

public function createXdebugHandler(
LoggerInterface $logger,
Expand Down
36 changes: 36 additions & 0 deletions src/Factory/SoftMocksFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Mougrim\XdebugProxy\Factory;

use Mougrim\XdebugProxy\RequestPreparer\Error as RequestPreparerError;
use Mougrim\XdebugProxy\RequestPreparer\SoftMocksRequestPreparer;
use Psr\Log\LoggerInterface;
use function array_merge;

/**
* @author Mougrim <[email protected]>
*/
class SoftMocksFactory extends DefaultFactory
{
/**
* {@inheritdoc}
*/
public function createRequestPreparers(LoggerInterface $logger): array
{
$requestPreparers = parent::createRequestPreparers($logger);

return array_merge($requestPreparers, [$this->createSoftMocksRequestPreparer($logger)]);
}

/**
* @param LoggerInterface $logger
*
* @throws RequestPreparerError
*
* @return SoftMocksRequestPreparer
*/
public function createSoftMocksRequestPreparer(LoggerInterface $logger): SoftMocksRequestPreparer
{
return new SoftMocksRequestPreparer($logger);
}
}
8 changes: 8 additions & 0 deletions src/Handler/CommandToXdebugParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,12 @@ interface CommandToXdebugParser
* @return array [$command, $arguments]
*/
public function parseCommand(string $request): array;

/**
* @param string $command
* @param array $arguments
*
* @return string
*/
public function buildCommand(string $command, array $arguments): string;
}
73 changes: 66 additions & 7 deletions src/Handler/DefaultIdeHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
use Amp\Socket\ConnectException;
use Amp\Socket\ServerSocket;
use Generator;
use Mougrim\XdebugProxy\RequestPreparer;
use Mougrim\XdebugProxy\RequestPreparer\Error as RequestPreparerError;
use Mougrim\XdebugProxy\RequestPreparer\Exception as RequestPreparerException;
use Mougrim\XdebugProxy\RequestPreparer\RequestPreparer;
use Mougrim\XdebugProxy\Xml\XmlContainer;
use Mougrim\XdebugProxy\Xml\XmlConverter;
use Mougrim\XdebugProxy\Xml\XmlDocument;
Expand All @@ -21,6 +23,7 @@
use function array_slice;
use function count;
use function explode;
use function get_class;
use function implode;
use function preg_match;
use function strlen;
Expand Down Expand Up @@ -293,7 +296,11 @@ public function processRequest(XmlDocument $xmlRequest, string $rawRequest, Serv
/** @var ClientSocket $ideSocket */
$ideSocket = $this->ideSockets->offsetGet($xdebugSocket);
$context['ide'] = $ideSocket->getRemoteAddress();
$this->prepareRequestToIde($xmlRequest, $rawRequest);
try {
$this->prepareRequestToIde($xmlRequest, $rawRequest, $context);
} catch (RequestPreparerError $error) {
throw new FromXdebugProcessError("Can't prepare request to ide", $context, $error);
}

try {
$request = $this->xmlConverter->generate($xmlRequest);
Expand All @@ -313,10 +320,28 @@ public function processRequest(XmlDocument $xmlRequest, string $rawRequest, Serv
$this->logger->notice('[Xdebug][Ide] Request was sent to ide, waiting response.', $context);
}

protected function prepareRequestToIde(XmlDocument $xmlRequest, string $rawRequest)
/**
* @param XmlDocument $xmlRequest
* @param string $rawRequest
* @param array $context
*
* @throws RequestPreparerError
*
* @return void
*/
protected function prepareRequestToIde(XmlDocument $xmlRequest, string $rawRequest, array $context)
{
foreach ($this->requestPreparers as $requestPreparer) {
$requestPreparer->prepareRequestToIde($xmlRequest, $rawRequest);
try {
$requestPreparer->prepareRequestToIde($xmlRequest, $rawRequest);
} catch (RequestPreparerException $exception) {
$this->logger->error(
"Can't prepare request to ide: {$exception}",
$context + [
'preparer' => get_class($requestPreparer),
]
);
}
}
}

Expand Down Expand Up @@ -408,7 +433,7 @@ public function handleIde(string $ideKey, ServerSocket $xdebugSocket, ClientSock
'[Xdebug][Ide] Prepare ide request',
$context + ['request' => $request]
);
$request = $this->prepareRequestToXdebug($request);
$request = $this->prepareRequestToXdebug($request, $context);
$this->logger->info(
'[Xdebug][Ide] Send prepared request to xdebug',
$context + ['request' => $request]
Expand All @@ -418,6 +443,12 @@ public function handleIde(string $ideKey, ServerSocket $xdebugSocket, ClientSock
}
} catch (ClosedException $exception) {
// skip exception, close other connections below
} catch (RequestPreparerError $error) {
$this->logger->critical(
"Can't prepare request: {$error}",
$context
);
// close other connections below
}

if ($buffer) {
Expand All @@ -436,10 +467,28 @@ public function handleIde(string $ideKey, ServerSocket $xdebugSocket, ClientSock
}
}

protected function prepareRequestToXdebug(string $request): string
/**
* @param string $request
* @param array $context
*
* @throws RequestPreparerError
*
* @return string prepared request
*/
protected function prepareRequestToXdebug(string $request, array $context): string
{
foreach ($this->requestPreparers as $requestPreparer) {
$request = $requestPreparer->prepareRequestToXdebug($request, $this);
try {
$request = $requestPreparer->prepareRequestToXdebug($request, $this);
} catch (RequestPreparerException $exception) {
$this->logger->error(
"Can't prepare request to xdebug: {$exception}",
$context + [
'preparer' => get_class($requestPreparer),
'request' => $request,
]
);
}
}

return $request;
Expand All @@ -453,6 +502,16 @@ public function parseCommand(string $request): array
return [$command, $arguments];
}

public function buildCommand(string $command, array $arguments): string
{
$argument_strings = [];
foreach ($arguments as $argument => $value) {
$argument_strings[] = "{$argument} {$value}";
}

return $command.' '.implode(' ', $argument_strings);
}

protected function parseArguments(string $arguments): array
{
$context = [
Expand Down
23 changes: 4 additions & 19 deletions src/RequestPreparer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,12 @@

namespace Mougrim\XdebugProxy;

use Mougrim\XdebugProxy\Handler\CommandToXdebugParser;
use Mougrim\XdebugProxy\Xml\XmlDocument;

/**
* @deprecated
* @see RequestPreparer\RequestPreparer
*
* @author Mougrim <[email protected]>
*/
interface RequestPreparer
interface RequestPreparer extends RequestPreparer\RequestPreparer
{
/**
* @param XmlDocument $xmlRequest
* @param string $rawRequest
*
* @return void
*/
public function prepareRequestToIde(XmlDocument $xmlRequest, string $rawRequest);

/**
* @param string $request
* @param CommandToXdebugParser $commandToXdebugParser
*
* @return string
*/
public function prepareRequestToXdebug(string $request, CommandToXdebugParser $commandToXdebugParser): string;
}
12 changes: 12 additions & 0 deletions src/RequestPreparer/Error.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Mougrim\XdebugProxy\RequestPreparer;

use RuntimeException;

/**
* @author Mougrim <[email protected]>
*/
class Error extends RuntimeException
{
}
12 changes: 12 additions & 0 deletions src/RequestPreparer/Exception.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Mougrim\XdebugProxy\RequestPreparer;

use Exception as BaseException;

/**
* @author Mougrim <[email protected]>
*/
class Exception extends BaseException
{
}
34 changes: 34 additions & 0 deletions src/RequestPreparer/RequestPreparer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace Mougrim\XdebugProxy\RequestPreparer;

use Mougrim\XdebugProxy\Handler\CommandToXdebugParser;
use Mougrim\XdebugProxy\Xml\XmlDocument;

/**
* @author Mougrim <[email protected]>
*/
interface RequestPreparer
{
/**
* @param XmlDocument $xmlRequest
* @param string $rawRequest
*
* @throws Exception
* @throws Error
*
* @return void
*/
public function prepareRequestToIde(XmlDocument $xmlRequest, string $rawRequest);

/**
* @param string $request
* @param CommandToXdebugParser $commandToXdebugParser
*
* @throws Exception
* @throws Error
*
* @return string
*/
public function prepareRequestToXdebug(string $request, CommandToXdebugParser $commandToXdebugParser): string;
}
Loading