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
- 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
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\RenderView 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. |