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); }
Please login to continue.