HtmlResponseBigPipeSubscriber::onRespond

public HtmlResponseBigPipeSubscriber::onRespond(FilterResponseEvent $event)

Transforms a HtmlResponse to a BigPipeResponse.

Parameters

\Symfony\Component\HttpKernel\Event\FilterResponseEvent $event: The event to process.

File

core/modules/big_pipe/src/EventSubscriber/HtmlResponseBigPipeSubscriber.php, line 69

Class

HtmlResponseBigPipeSubscriber
Response subscriber to replace the HtmlResponse with a BigPipeResponse.

Namespace

Drupal\big_pipe\EventSubscriber

Code

public function onRespond(FilterResponseEvent $event) {
  $response = $event->getResponse();
  if (!$response instanceof HtmlResponse) {
    return;
  }

  $attachments = $response->getAttachments();

  // If there are no no-JS BigPipe placeholders, unwrap the scripts_bottom
  // markup.
  // @see onRespondEarly()
  // @see \Drupal\big_pipe\Render\BigPipe::sendPreBody()
  if (empty($attachments['big_pipe_nojs_placeholders'])) {
    $content = $response->getContent();
    $content = str_replace('<drupal-big-pipe-scripts-bottom-marker>', '', $content);
    $response->setContent($content);
  }

  // If there are neither BigPipe placeholders nor no-JS BigPipe placeholders,
  // there isn't anything dynamic in this response, and we can return early:
  // there is no point in sending this response using BigPipe.
  if (empty($attachments['big_pipe_placeholders']) && empty($attachments['big_pipe_nojs_placeholders'])) {
    return;
  }

  $big_pipe_response = new BigPipeResponse();
  $big_pipe_response->setBigPipeService($this->bigPipe);

  // Clone the HtmlResponse's data into the new BigPipeResponse.
  $big_pipe_response->headers = clone $response->headers;
  $big_pipe_response
  ->setStatusCode($response->getStatusCode())
    ->setContent($response->getContent())
    ->setAttachments($attachments)
    ->addCacheableDependency($response->getCacheableMetadata());

  // A BigPipe response can never be cached, because it is intended for a
  // single user.
  // @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
  $big_pipe_response->setPrivate();

  // Inform surrogates how they should handle BigPipe responses:
  // - "no-store" specifies that the response should not be stored in cache;
  //   it is only to be used for the original request
  // - "content" identifies what processing surrogates should perform on the
  //   response before forwarding it. We send, "BigPipe/1.0", which surrogates
  //   should not process at all, and in fact, they should not even buffer it
  //   at all.
  // @see http://www.w3.org/TR/edge-arch/
  $big_pipe_response->headers->set('Surrogate-Control', 'no-store, content="BigPipe/1.0"');

  // Add header to support streaming on NGINX + php-fpm (nginx >= 1.5.6).
  $big_pipe_response->headers->set('X-Accel-Buffering', 'no');

  $event->setResponse($big_pipe_response);
}
doc_Drupal
2016-10-29 09:18:55
Comments
Leave a Comment

Please login to continue.