Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193<?php
final class AphrontFileResponse extends AphrontResponse {
private $content; private $contentIterator; private $contentLength; private $compressResponse;
private $mimeType;
/** * Download filename * * This is NULL as default or a string. * * @var string|null */ private $download;
private $rangeMin; private $rangeMax; private $allowOrigins = array();
public function addAllowOrigin($origin) { $this->allowOrigins[] = $origin; return $this; }
/** * Set a download filename * * @param string $download * @return self */ public function setDownload($download) {
// Make sure we have a populated string if (!phutil_nonempty_string($download)) { $download = 'untitled'; }
$this->download = $download; return $this; }
/** * Get the download filename * * If this was never set, NULL is given. * * @return string|null */ public function getDownload() { return $this->download; }
public function setMimeType($mime_type) { $this->mimeType = $mime_type; return $this; }
public function getMimeType() { return $this->mimeType; }
public function setContent($content) { $this->setContentLength(strlen($content)); $this->content = $content; return $this; }
public function setContentIterator($iterator) { $this->contentIterator = $iterator; return $this; }
public function buildResponseString() { return $this->content; }
public function getContentIterator() { if ($this->contentIterator) { return $this->contentIterator; } return parent::getContentIterator(); }
public function setContentLength($length) { $this->contentLength = $length; return $this; }
public function getContentLength() { return $this->contentLength; }
public function setCompressResponse($compress_response) { $this->compressResponse = $compress_response; return $this; }
public function getCompressResponse() { return $this->compressResponse; }
public function setRange($min, $max) { $this->rangeMin = $min; $this->rangeMax = $max; return $this; }
public function getHeaders() { $headers = array( array('Content-Type', $this->getMimeType()), // This tells clients that we can support requests with a "Range" header, // which allows downloads to be resumed, in some browsers, some of the // time, if the stars align. array('Accept-Ranges', 'bytes'), );
if ($this->rangeMin !== null || $this->rangeMax !== null) { $len = $this->getContentLength(); $min = $this->rangeMin;
$max = $this->rangeMax; if ($max === null) { $max = ($len - 1); }
$headers[] = array('Content-Range', "bytes {$min}-{$max}/{$len}"); $content_len = ($max - $min) + 1; } else { $content_len = $this->getContentLength(); }
if (!$this->shouldCompressResponse()) { $headers[] = array('Content-Length', $content_len); }
if (phutil_nonempty_string($this->getDownload())) { $headers[] = array('X-Download-Options', 'noopen');
$filename = $this->getDownload(); $filename = addcslashes($filename, '"\\'); $headers[] = array( 'Content-Disposition', 'attachment; filename="'.$filename.'"', ); }
if ($this->allowOrigins) { $headers[] = array( 'Access-Control-Allow-Origin', implode(',', $this->allowOrigins), ); }
$headers = array_merge(parent::getHeaders(), $headers); return $headers; }
protected function shouldCompressResponse() { return $this->getCompressResponse(); }
public function parseHTTPRange($range) { $begin = null; $end = null;
$matches = null; if (preg_match('/^bytes=(\d+)-(\d*)$/', $range, $matches)) { // Note that the "Range" header specifies bytes differently than // we do internally: the range 0-1 has 2 bytes (byte 0 and byte 1). $begin = (int)$matches[1];
// The "Range" may be "200-299" or "200-", meaning "until end of file". if (strlen($matches[2])) { $range_end = (int)$matches[2]; $end = $range_end + 1; } else { $range_end = null; }
$this->setHTTPResponseCode(206); $this->setRange($begin, $range_end); }
return array($begin, $end); }
}