Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. BigPipeResponse.php

class BigPipeResponse

A response that is sent in chunks by the BigPipe service.

Note we cannot use \Symfony\Component\HttpFoundation\StreamedResponse because it makes the content inaccessible (hidden behind a callback), which means no middlewares are able to modify the content anymore.

@internal This is a temporary solution until a generic response emitter interface is created in https://www.drupal.org/node/2577631. Only code internal to BigPipe should instantiate or type hint to this class.

Hierarchy

  • class \Symfony\Component\HttpFoundation\Response
    • class \Drupal\Core\Render\HtmlResponse extends \Symfony\Component\HttpFoundation\Response implements \Drupal\Core\Cache\CacheableResponseInterface, \Drupal\Core\Render\AttachmentsInterface uses \Drupal\Core\Cache\CacheableResponseTrait, \Drupal\Core\Render\AttachmentsTrait
      • class \Drupal\big_pipe\Render\BigPipeResponse extends \Drupal\Core\Render\HtmlResponse implements \Drupal\Core\Session\ResponseKeepSessionOpenInterface

Expanded class hierarchy of BigPipeResponse

See also

\Drupal\big_pipe\Render\BigPipe

2 files declare their use of BigPipeResponse
ContentLength.php in core/modules/big_pipe/src/StackMiddleware/ContentLength.php
HtmlResponseBigPipeSubscriber.php in core/modules/big_pipe/src/EventSubscriber/HtmlResponseBigPipeSubscriber.php

File

core/modules/big_pipe/src/Render/BigPipeResponse.php, line 22

Namespace

Drupal\big_pipe\Render
View source
class BigPipeResponse extends HtmlResponse implements ResponseKeepSessionOpenInterface {
    
    /**
     * The BigPipe service.
     *
     * @var \Drupal\big_pipe\Render\BigPipe
     */
    protected $bigPipe;
    
    /**
     * The original HTML response.
     *
     * Still contains placeholders. Its cacheability metadata and attachments are
     * for everything except the placeholders (since those are not yet rendered).
     *
     * @var \Drupal\Core\Render\HtmlResponse
     *
     * @see \Drupal\Core\Render\StreamedResponseInterface
     * @see ::getStreamedResponse()
     */
    protected $originalHtmlResponse;
    
    /**
     * Constructs a new BigPipeResponse.
     *
     * @param \Drupal\Core\Render\HtmlResponse $response
     *   The original HTML response.
     */
    public function __construct(HtmlResponse $response) {
        parent::__construct('', $response->getStatusCode(), []);
        $this->originalHtmlResponse = $response;
        $this->populateBasedOnOriginalHtmlResponse();
    }
    
    /**
     * Returns the original HTML response.
     *
     * @return \Drupal\Core\Render\HtmlResponse
     *   The original HTML response.
     */
    public function getOriginalHtmlResponse() {
        return $this->originalHtmlResponse;
    }
    
    /**
     * Populates this BigPipeResponse object based on the original HTML response.
     */
    protected function populateBasedOnOriginalHtmlResponse() {
        // Clone the HtmlResponse's data into the new BigPipeResponse.
        $this->headers = clone $this->originalHtmlResponse->headers;
        $this->setStatusCode($this->originalHtmlResponse
            ->getStatusCode())
            ->setContent($this->originalHtmlResponse
            ->getContent())
            ->setAttachments($this->originalHtmlResponse
            ->getAttachments())
            ->addCacheableDependency($this->originalHtmlResponse
            ->getCacheableMetadata());
        // A BigPipe response can never be cached, because it is intended for a
        // single user.
        // @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
        $this->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 https://www.w3.org/TR/edge-arch/
        $this->headers
            ->set('Surrogate-Control', 'no-store, content="BigPipe/1.0"');
        // Add header to support streaming on NGINX + php-fpm (nginx >= 1.5.6).
        $this->headers
            ->set('X-Accel-Buffering', 'no');
    }
    
    /**
     * Sets the BigPipe service to use.
     *
     * @param \Drupal\big_pipe\Render\BigPipe $big_pipe
     *   The BigPipe service.
     */
    public function setBigPipeService(BigPipe $big_pipe) {
        $this->bigPipe = $big_pipe;
    }
    
    /**
     * {@inheritdoc}
     */
    public function sendContent() : static {
        $this->bigPipe
            ->sendContent($this);
        // All BigPipe placeholders are processed, so update this response's
        // attachments.
        unset($this->attachments['big_pipe_placeholders']);
        unset($this->attachments['big_pipe_nojs_placeholders']);
        return $this;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
AttachmentsTrait::$attachments protected property The attachments for this response.
AttachmentsTrait::addAttachments public function
AttachmentsTrait::getAttachments public function
AttachmentsTrait::setAttachments public function
BigPipeResponse::$bigPipe protected property The BigPipe service.
BigPipeResponse::$originalHtmlResponse protected property The original HTML response.
BigPipeResponse::getOriginalHtmlResponse public function Returns the original HTML response.
BigPipeResponse::populateBasedOnOriginalHtmlResponse protected function Populates this BigPipeResponse object based on the original HTML response.
BigPipeResponse::sendContent public function Sends content for the current web response. Overrides Response::sendContent
BigPipeResponse::setBigPipeService public function Sets the BigPipe service to use.
BigPipeResponse::__construct public function Constructs a new BigPipeResponse. Overrides HtmlResponse::__construct
CacheableResponseTrait::$cacheabilityMetadata protected property The cacheability metadata.
CacheableResponseTrait::addCacheableDependency public function
CacheableResponseTrait::getCacheableMetadata public function
HtmlResponse::setContent public function Sets the response content. Overrides Response::setContent
Response::$charset protected property
Response::$content protected property
Response::$headers public property
Response::$sentHeaders private property Tracks headers already sent in informational responses.
Response::$statusCode protected property
Response::$statusText protected property
Response::$statusTexts public static property Status codes translation table.
Response::$version protected property
Response::closeOutputBuffers public static function Cleans or flushes output buffers up to target level.
Response::ensureIEOverSSLCompatibility protected function Checks if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9.
Response::expire public function Marks the response stale by setting the Age header to be equal to the maximum age of the response.
Response::getAge public function Returns the age of the response in seconds.
Response::getCharset public function Retrieves the response charset.
Response::getContent public function Gets the current response content. 2
Response::getDate public function Returns the Date header as a DateTime instance.
Response::getEtag public function Returns the literal value of the ETag HTTP header.
Response::getExpires public function Returns the value of the Expires header as a DateTime instance.
Response::getLastModified public function Returns the Last-Modified HTTP header as a DateTime instance.
Response::getMaxAge public function Returns the number of seconds after the time specified in the response's Date
header when the response should no longer be considered fresh.
Response::getProtocolVersion public function Gets the HTTP protocol version.
Response::getStatusCode public function Retrieves the status code for the current web response.
Response::getTtl public function Returns the response's time-to-live in seconds.
Response::getVary public function Returns an array of header names given in the Vary header.
Response::hasVary public function Returns true if the response includes a Vary header.
Response::HTTP_ACCEPTED public constant
Response::HTTP_ALREADY_REPORTED public constant
Response::HTTP_BAD_GATEWAY public constant
Response::HTTP_BAD_REQUEST public constant
Response::HTTP_CONFLICT public constant
Response::HTTP_CONTINUE public constant
Response::HTTP_CREATED public constant
Response::HTTP_EARLY_HINTS public constant
Response::HTTP_EXPECTATION_FAILED public constant
Response::HTTP_FAILED_DEPENDENCY public constant
Response::HTTP_FORBIDDEN public constant
Response::HTTP_FOUND public constant
Response::HTTP_GATEWAY_TIMEOUT public constant
Response::HTTP_GONE public constant
Response::HTTP_IM_USED public constant
Response::HTTP_INSUFFICIENT_STORAGE public constant
Response::HTTP_INTERNAL_SERVER_ERROR public constant
Response::HTTP_I_AM_A_TEAPOT public constant
Response::HTTP_LENGTH_REQUIRED public constant
Response::HTTP_LOCKED public constant
Response::HTTP_LOOP_DETECTED public constant
Response::HTTP_METHOD_NOT_ALLOWED public constant
Response::HTTP_MISDIRECTED_REQUEST public constant
Response::HTTP_MOVED_PERMANENTLY public constant
Response::HTTP_MULTIPLE_CHOICES public constant
Response::HTTP_MULTI_STATUS public constant
Response::HTTP_NETWORK_AUTHENTICATION_REQUIRED public constant
Response::HTTP_NON_AUTHORITATIVE_INFORMATION public constant
Response::HTTP_NOT_ACCEPTABLE public constant
Response::HTTP_NOT_EXTENDED public constant
Response::HTTP_NOT_FOUND public constant
Response::HTTP_NOT_IMPLEMENTED public constant
Response::HTTP_NOT_MODIFIED public constant
Response::HTTP_NO_CONTENT public constant
Response::HTTP_OK public constant
Response::HTTP_PARTIAL_CONTENT public constant
Response::HTTP_PAYMENT_REQUIRED public constant
Response::HTTP_PERMANENTLY_REDIRECT public constant
Response::HTTP_PRECONDITION_FAILED public constant
Response::HTTP_PRECONDITION_REQUIRED public constant
Response::HTTP_PROCESSING public constant
Response::HTTP_PROXY_AUTHENTICATION_REQUIRED public constant
Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE public constant
Response::HTTP_REQUEST_ENTITY_TOO_LARGE public constant
Response::HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE public constant
Response::HTTP_REQUEST_TIMEOUT public constant
Response::HTTP_REQUEST_URI_TOO_LONG public constant
Response::HTTP_RESERVED public constant
Response::HTTP_RESET_CONTENT public constant
Response::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES private constant
Response::HTTP_SEE_OTHER public constant
Response::HTTP_SERVICE_UNAVAILABLE public constant
Response::HTTP_SWITCHING_PROTOCOLS public constant
Response::HTTP_TEMPORARY_REDIRECT public constant
Response::HTTP_TOO_EARLY public constant
Response::HTTP_TOO_MANY_REQUESTS public constant
Response::HTTP_UNAUTHORIZED public constant
Response::HTTP_UNAVAILABLE_FOR_LEGAL_REASONS public constant
Response::HTTP_UNPROCESSABLE_ENTITY public constant
Response::HTTP_UNSUPPORTED_MEDIA_TYPE public constant
Response::HTTP_UPGRADE_REQUIRED public constant
Response::HTTP_USE_PROXY public constant
Response::HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL public constant
Response::HTTP_VERSION_NOT_SUPPORTED public constant
Response::isCacheable public function Returns true if the response may safely be kept in a shared (surrogate) cache.
Response::isClientError public function Is there a client error?
Response::isEmpty public function Is the response empty?
Response::isForbidden public function Is the response forbidden?
Response::isFresh public function Returns true if the response is "fresh".
Response::isImmutable public function Returns true if the response is marked as "immutable".
Response::isInformational public function Is response informative?
Response::isInvalid public function Is response invalid?
Response::isNotFound public function Is the response a not found error?
Response::isNotModified public function Determines if the Response validators (ETag, Last-Modified) match
a conditional value specified in the Request.
Response::isOk public function Is the response OK?
Response::isRedirect public function Is the response a redirect of some form?
Response::isRedirection public function Is the response a redirect?
Response::isServerError public function Was there a server side error?
Response::isSuccessful public function Is response successful?
Response::isValidateable public function Returns true if the response includes headers that can be used to validate
the response with the origin server using a conditional GET request.
Response::mustRevalidate public function Returns true if the response must be revalidated by shared caches once it has become stale.
Response::prepare public function Prepares the Response before it is sent to the client. 1
Response::send public function Sends HTTP headers and content.
Response::sendHeaders public function Sends HTTP headers. 1
Response::setCache public function Sets the response's cache headers (validation and/or expiration).
Response::setCharset public function Sets the response charset.
Response::setClientTtl public function Sets the response's time-to-live for private/client caches in seconds.
Response::setContentSafe public function Marks a response as safe according to RFC8674.
Response::setDate public function Sets the Date header.
Response::setEtag public function Sets the ETag value.
Response::setExpires public function Sets the Expires HTTP header with a DateTime instance.
Response::setImmutable public function Marks the response as "immutable".
Response::setLastModified public function Sets the Last-Modified HTTP header with a DateTime instance.
Response::setMaxAge public function Sets the number of seconds after which the response should no longer be considered fresh.
Response::setNotModified public function Modifies the response so that it conforms to the rules defined for a 304 status code.
Response::setPrivate public function Marks the response as "private".
Response::setProtocolVersion public function Sets the HTTP protocol version (1.0 or 1.1).
Response::setPublic public function Marks the response as "public".
Response::setSharedMaxAge public function Sets the number of seconds after which the response should no longer be considered fresh by shared caches.
Response::setStaleIfError public function Sets the number of seconds after which the response should no longer be returned by shared caches when backend is down.
Response::setStaleWhileRevalidate public function Sets the number of seconds after which the response should no longer return stale content by shared caches.
Response::setStatusCode public function Sets the response status code.
Response::setTtl public function Sets the response's time-to-live for shared caches in seconds.
Response::setVary public function Sets the Vary header.
Response::__clone public function Clones the current Response instance.
Response::__toString public function Returns the Response as an HTTP string.
RSS feed
Powered by Drupal