TextResponseReader.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <?php
  2. namespace Predis\Protocols;
  3. use Predis\Utils;
  4. use Predis\CommunicationException;
  5. use Predis\MalformedServerResponse;
  6. use Predis\Network\IConnectionComposable;
  7. class TextResponseReader implements IResponseReader {
  8. private $_prefixHandlers;
  9. public function __construct() {
  10. $this->_prefixHandlers = $this->getDefaultHandlers();
  11. }
  12. private function getDefaultHandlers() {
  13. return array(
  14. TextProtocol::PREFIX_STATUS => new ResponseStatusHandler(),
  15. TextProtocol::PREFIX_ERROR => new ResponseErrorHandler(),
  16. TextProtocol::PREFIX_INTEGER => new ResponseIntegerHandler(),
  17. TextProtocol::PREFIX_BULK => new ResponseBulkHandler(),
  18. TextProtocol::PREFIX_MULTI_BULK => new ResponseMultiBulkHandler(),
  19. );
  20. }
  21. public function setHandler($prefix, IResponseHandler $handler) {
  22. $this->_prefixHandlers[$prefix] = $handler;
  23. }
  24. public function getHandler($prefix) {
  25. if (isset($this->_prefixHandlers[$prefix])) {
  26. return $this->_prefixHandlers[$prefix];
  27. }
  28. }
  29. public function read(IConnectionComposable $connection) {
  30. $header = $connection->readLine();
  31. if ($header === '') {
  32. $this->throwMalformedResponse($connection, 'Unexpected empty header');
  33. }
  34. $prefix = $header[0];
  35. if (!isset($this->_prefixHandlers[$prefix])) {
  36. $this->throwMalformedResponse($connection, "Unknown prefix '$prefix'");
  37. }
  38. $handler = $this->_prefixHandlers[$prefix];
  39. return $handler->handle($connection, substr($header, 1));
  40. }
  41. private function throwMalformedResponse(IConnectionComposable $connection, $message) {
  42. Utils::onCommunicationException(new MalformedServerResponse(
  43. $connection, $message
  44. ));
  45. }
  46. }