ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
ILIAS\FileDelivery\Delivery\StreamDelivery Class Reference
+ Inheritance diagram for ILIAS\FileDelivery\Delivery\StreamDelivery:
+ Collaboration diagram for ILIAS\FileDelivery\Delivery\StreamDelivery:

Public Member Functions

 __construct (private DataSigner $data_signer, Services $http, ResponseBuilder $response_builder, ResponseBuilder $fallback_response_builder,)
 
 attached (FileStream $stream, string $download_file_name, ?string $mime_type=null)
 
 inline (FileStream $stream, string $download_file_name, ?string $mime_type=null)
 
 deliver (FileStream $stream, string $download_file_name, ?string $mime_type=null, Disposition $disposition=Disposition::INLINE)
 
 deliverFromToken (string $token)
 
- Public Member Functions inherited from ILIAS\FileDelivery\Delivery\BaseDelivery
 __construct (protected Services $http, protected ResponseBuilder $response_builder, protected ResponseBuilder $fallback_response_builder,)
 

Data Fields

const SUBREQUEST_SEPARATOR = '/-/'
 

Private Member Functions

 notFound (ResponseInterface $r)
 
 determineMimeType (string $filename)
 

Additional Inherited Members

- Protected Member Functions inherited from ILIAS\FileDelivery\Delivery\BaseDelivery
 saveAndClose (ResponseInterface $r, ?string $path_to_delete=null)
 
 setGeneralHeaders (ResponseInterface $r, string $uri, string $mime_type, string $file_name, Disposition $disposition=Disposition::INLINE)
 
- Protected Attributes inherited from ILIAS\FileDelivery\Delivery\BaseDelivery
const MIME_TYPE_MAP = __DIR__ . '/../../../FileUpload/src/mime_type_map.php'
 
array $mime_type_map
 

Detailed Description

Author
Fabian Schmid fabia.nosp@m.n@sr.nosp@m..solu.nosp@m.tion.nosp@m.s

Definition at line 36 of file StreamDelivery.php.

Constructor & Destructor Documentation

◆ __construct()

ILIAS\FileDelivery\Delivery\StreamDelivery::__construct ( private DataSigner  $data_signer,
Services  $http,
ResponseBuilder  $response_builder,
ResponseBuilder  $fallback_response_builder 
)

Definition at line 43 of file StreamDelivery.php.

References ILIAS\GlobalScreen\Provider\__construct().

48  {
49  parent::__construct($http, $response_builder, $fallback_response_builder);
50  }
$http
Definition: deliver.php:30
__construct(Container $dic, ilPlugin $plugin)
+ Here is the call graph for this function:

Member Function Documentation

◆ attached()

ILIAS\FileDelivery\Delivery\StreamDelivery::attached ( FileStream  $stream,
string  $download_file_name,
?string  $mime_type = null 
)

Definition at line 62 of file StreamDelivery.php.

References ILIAS\FileDelivery\Delivery\$mime_type, and ILIAS\FileDelivery\Delivery\StreamDelivery\deliver().

66  : never {
67  $this->deliver(
68  $stream,
70  $mime_type,
71  Disposition::ATTACHMENT
72  );
73  }
deliver(FileStream $stream, string $download_file_name, ?string $mime_type=null, Disposition $disposition=Disposition::INLINE)
+ Here is the call graph for this function:

◆ deliver()

ILIAS\FileDelivery\Delivery\StreamDelivery::deliver ( FileStream  $stream,
string  $download_file_name,
?string  $mime_type = null,
Disposition  $disposition = Disposition::INLINE 
)

Definition at line 88 of file StreamDelivery.php.

References ILIAS\FileDelivery\Delivery\$disposition, $r, ILIAS\FileDelivery\http(), ILIAS\FileDelivery\Delivery\BaseDelivery\saveAndClose(), and ILIAS\FileDelivery\Delivery\BaseDelivery\setGeneralHeaders().

Referenced by ILIAS\FileDelivery\Delivery\StreamDelivery\attached(), and ILIAS\FileDelivery\Delivery\StreamDelivery\inline().

93  : never {
94  $r = $this->http->response();
95  $uri = $stream->getMetadata()['uri'];
96 
97  if ($stream instanceof ZIPStream || $stream->getMetadata()['uri'] === 'php://memory') {
98  $this->response_builder = $this->fallback_response_builder;
99  }
100 
101  $r = $this->setGeneralHeaders(
102  $r,
103  $uri,
104  $mime_type ?? mime_content_type($uri),
107  );
108 
109  $r = $this->response_builder->buildForStream(
110  $this->http->request(),
111  $r,
112  $stream
113  );
114  $this->saveAndClose($r);
115  }
setGeneralHeaders(ResponseInterface $r, string $uri, string $mime_type, string $file_name, Disposition $disposition=Disposition::INLINE)
saveAndClose(ResponseInterface $r, ?string $path_to_delete=null)
static http()
Fetches the global http state from ILIAS.
$r
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ deliverFromToken()

ILIAS\FileDelivery\Delivery\StreamDelivery::deliverFromToken ( string  $token)

Definition at line 117 of file StreamDelivery.php.

References ILIAS\FileDelivery\Delivery\$disposition, $parts, $payload, $r, ILIAS\FileDelivery\Delivery\StreamDelivery\determineMimeType(), ILIAS\FileDelivery\http(), ILIAS\FileDelivery\Delivery\StreamDelivery\notFound(), null, ILIAS\Filesystem\Stream\Streams\ofFileInsideZIP(), ILIAS\Filesystem\Stream\Streams\ofResource(), and ILIAS\FileDelivery\Delivery\BaseDelivery\setGeneralHeaders().

117  : never
118  {
119  // check if $token has a sub-request, such as .../index.html
120  $parts = explode(self::SUBREQUEST_SEPARATOR, $token);
121  $sub_request = null;
122  if (count($parts) > 1) {
123  $token = $parts[0];
124  $sub_request = implode('/', array_slice($parts, 1));
125  }
126 
127  $r = $this->http->response();
128  $payload = $this->data_signer->verifyStreamToken($token);
129 
130  switch (true) {
131  case $payload instanceof FilePayload:
132  $uri = $payload->getUri();
133  $mime_type = $payload->getMimeType();
134  $file_name = $payload->getFilename();
135  $disposition = Disposition::tryFrom($payload->getDisposition()) ?? Disposition::INLINE;
136  break;
137  case $payload instanceof ShortFilePayload:
138  $uri = $payload->getUri();
139  $mime_type = $this->determineMimeType($uri);
140  $file_name = $payload->getFilename();
141  $disposition = Disposition::INLINE;
142  break;
143  default:
144  $this->notFound($r);
145  }
146  unset($payload);
147 
148  // handle direct access to file
149 
150  if ($sub_request === null) {
151  $r = $this->setGeneralHeaders(
152  $r,
153  $uri,
154  $mime_type,
155  $file_name,
157  );
158 
159  $this->http->saveResponse(
160  $this->response_builder->buildForStream(
161  $this->http->request(),
162  $r,
163  Streams::ofResource(fopen($uri, 'rb'))
164  )
165  );
166  } else { // handle subrequest, aka file in a ZIP
167  $requested_zip = $uri;
168  $sub_request = urldecode($sub_request);
169  // remove query
170  $sub_request = explode('?', $sub_request)[0];
171 
172  try {
173  $file_inside_ZIP = Streams::ofFileInsideZIP($requested_zip, $sub_request);
174  } catch (\Throwable) {
175  $this->notFound($r);
176  }
177  $file_inside_zip_uri = $file_inside_ZIP->getMetadata()['uri'];
178  $file_inside_zip_stream = fopen($file_inside_zip_uri, 'rb');
179 
180  if ($file_inside_zip_stream === false) {
181  $this->notFound($r);
182  }
183 
184  // we must use PHPResponseBuilder here, because the streams inside zips cant be delivered using XSendFile or others
185  $this->response_builder = $this->fallback_response_builder;
186 
187  $mime_type = $this->determineMimeType($file_inside_zip_uri);
188  $r = $this->setGeneralHeaders(
189  $r,
190  $file_inside_zip_uri,
191  $mime_type,
192  basename($sub_request),
193  Disposition::INLINE // subrequests are always inline per default, browsers may change this to download
194  );
195 
196 
197  $this->http->saveResponse(
198  $this->response_builder->buildForStream(
199  $this->http->request(),
200  $r,
201  $file_inside_ZIP
202  )
203  );
204  }
205  $this->http->sendResponse();
206  $this->http->close();
207  }
setGeneralHeaders(ResponseInterface $r, string $uri, string $mime_type, string $file_name, Disposition $disposition=Disposition::INLINE)
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts
Definition: ltitoken.php:61
if(count($parts) !=3) $payload
Definition: ltitoken.php:67
static ofFileInsideZIP(string $path_to_zip, string $path_inside_zip)
Definition: Streams.php:84
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static ofResource($resource)
Wraps an already created resource with the stream abstraction.
Definition: Streams.php:64
static http()
Fetches the global http state from ILIAS.
$token
Definition: xapitoken.php:70
$r
+ Here is the call graph for this function:

◆ determineMimeType()

ILIAS\FileDelivery\Delivery\StreamDelivery::determineMimeType ( string  $filename)
private

Definition at line 209 of file StreamDelivery.php.

Referenced by ILIAS\FileDelivery\Delivery\StreamDelivery\deliverFromToken().

209  : string
210  {
211  $suffix = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
212  if (isset($this->mime_type_map[$suffix])) {
213  if (is_array($this->mime_type_map[$suffix]) && isset($this->mime_type_map[$suffix][0])) {
214  return $this->mime_type_map[$suffix][0];
215  }
216 
217  return $this->mime_type_map[$suffix];
218  }
219 
220  $mime_type = mime_content_type($filename);
221  if ($mime_type === 'application/octet-stream') {
222  $mime_type = mime_content_type(substr($filename, 64));
223  }
224  return $mime_type ?: 'application/octet-stream';
225  }
$filename
Definition: buildRTE.php:78
+ Here is the caller graph for this function:

◆ inline()

ILIAS\FileDelivery\Delivery\StreamDelivery::inline ( FileStream  $stream,
string  $download_file_name,
?string  $mime_type = null 
)

Definition at line 75 of file StreamDelivery.php.

References ILIAS\FileDelivery\Delivery\StreamDelivery\deliver().

79  : never {
80  $this->deliver(
81  $stream,
83  $mime_type,
84  Disposition::INLINE
85  );
86  }
deliver(FileStream $stream, string $download_file_name, ?string $mime_type=null, Disposition $disposition=Disposition::INLINE)
+ Here is the call graph for this function:

◆ notFound()

ILIAS\FileDelivery\Delivery\StreamDelivery::notFound ( ResponseInterface  $r)
private
Exceptions

Definition at line 55 of file StreamDelivery.php.

References ILIAS\FileDelivery\http().

Referenced by ILIAS\FileDelivery\Delivery\StreamDelivery\deliverFromToken().

55  : void
56  {
57  $this->http->saveResponse($r->withStatus(404));
58  $this->http->sendResponse();
59  $this->http->close();
60  }
static http()
Fetches the global http state from ILIAS.
$r
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Field Documentation

◆ SUBREQUEST_SEPARATOR

const ILIAS\FileDelivery\Delivery\StreamDelivery::SUBREQUEST_SEPARATOR = '/-/'

The documentation for this class was generated from the following file: