You are here

final class Serializer in Zircon Profile 8

Same name in this branch
  1. 8 vendor/symfony/serializer/Serializer.php \Symfony\Component\Serializer\Serializer
  2. 8 vendor/zendframework/zend-diactoros/src/Request/Serializer.php \Zend\Diactoros\Request\Serializer
  3. 8 vendor/zendframework/zend-diactoros/src/Response/Serializer.php \Zend\Diactoros\Response\Serializer
  4. 8 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php \phpDocumentor\Reflection\DocBlock\Serializer
  5. 8 core/modules/rest/src/Plugin/views/style/Serializer.php \Drupal\rest\Plugin\views\style\Serializer
Same name and namespace in other branches
  1. 8.0 vendor/zendframework/zend-diactoros/src/Request/Serializer.php \Zend\Diactoros\Request\Serializer

Serialize (cast to string) or deserialize (cast string to Request) messages.

This class provides functionality for serializing a RequestInterface instance to a string, as well as the reverse operation of creating a Request instance from a string/stream representing a message.

Hierarchy

Expanded class hierarchy of Serializer

File

vendor/zendframework/zend-diactoros/src/Request/Serializer.php, line 28

Namespace

Zend\Diactoros\Request
View source
final class Serializer extends AbstractSerializer {

  /**
   * Deserialize a request string to a request instance.
   *
   * Internally, casts the message to a stream and invokes fromStream().
   *
   * @param string $message
   * @return Request
   * @throws UnexpectedValueException when errors occur parsing the message.
   */
  public static function fromString($message) {
    $stream = new Stream('php://temp', 'wb+');
    $stream
      ->write($message);
    return self::fromStream($stream);
  }

  /**
   * Deserialize a request stream to a request instance.
   *
   * @param StreamInterface $stream
   * @return Request
   * @throws UnexpectedValueException when errors occur parsing the message.
   */
  public static function fromStream(StreamInterface $stream) {
    if (!$stream
      ->isReadable() || !$stream
      ->isSeekable()) {
      throw new InvalidArgumentException('Message stream must be both readable and seekable');
    }
    $stream
      ->rewind();
    list($method, $requestTarget, $version) = self::getRequestLine($stream);
    $uri = self::createUriFromRequestTarget($requestTarget);
    list($headers, $body) = self::splitStream($stream);
    return (new Request($uri, $method, $body, $headers))
      ->withProtocolVersion($version)
      ->withRequestTarget($requestTarget);
  }

  /**
   * Serialize a request message to a string.
   *
   * @param RequestInterface $request
   * @return string
   */
  public static function toString(RequestInterface $request) {
    $headers = self::serializeHeaders($request
      ->getHeaders());
    $body = (string) $request
      ->getBody();
    $format = '%s %s HTTP/%s%s%s';
    if (!empty($headers)) {
      $headers = "\r\n" . $headers;
    }
    if (!empty($body)) {
      $headers .= "\r\n\r\n";
    }
    return sprintf($format, $request
      ->getMethod(), $request
      ->getRequestTarget(), $request
      ->getProtocolVersion(), $headers, $body);
  }

  /**
   * Retrieve the components of the request line.
   *
   * Retrieves the first line of the stream and parses it, raising an
   * exception if it does not follow specifications; if valid, returns a list
   * with the method, target, and version, in that order.
   *
   * @param StreamInterface $stream
   * @return array
   */
  private static function getRequestLine(StreamInterface $stream) {
    $requestLine = self::getLine($stream);
    if (!preg_match('#^(?P<method>[!\\#$%&\'*+.^_`|~a-zA-Z0-9-]+) (?P<target>[^\\s]+) HTTP/(?P<version>[1-9]\\d*\\.\\d+)$#', $requestLine, $matches)) {
      throw new UnexpectedValueException('Invalid request line detected');
    }
    return [
      $matches['method'],
      $matches['target'],
      $matches['version'],
    ];
  }

  /**
   * Create and return a Uri instance based on the provided request target.
   *
   * If the request target is of authority or asterisk form, an empty Uri
   * instance is returned; otherwise, the value is used to create and return
   * a new Uri instance.
   *
   * @param string $requestTarget
   * @return Uri
   */
  private static function createUriFromRequestTarget($requestTarget) {
    if (preg_match('#^https?://#', $requestTarget)) {
      return new Uri($requestTarget);
    }
    if (preg_match('#^(\\*|[^/])#', $requestTarget)) {
      return new Uri();
    }
    return new Uri($requestTarget);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AbstractSerializer::CR constant
AbstractSerializer::EOL constant
AbstractSerializer::filterHeader protected static function Filter a header name to wordcase
AbstractSerializer::getLine protected static function Retrieve a single line from the stream.
AbstractSerializer::LF constant
AbstractSerializer::serializeHeaders protected static function Serialize headers to string values.
AbstractSerializer::splitStream protected static function Split the stream into headers and body content.
Serializer::createUriFromRequestTarget private static function Create and return a Uri instance based on the provided request target.
Serializer::fromStream public static function Deserialize a request stream to a request instance.
Serializer::fromString public static function Deserialize a request string to a request instance.
Serializer::getRequestLine private static function Retrieve the components of the request line.
Serializer::toString public static function Serialize a request message to a string.