ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
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/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 40 of file StreamDelivery.php.

References ILIAS\MetaData\Repository\Validation\Data\__construct().

45  {
46  parent::__construct($http, $response_builder, $fallback_response_builder);
47  }
__construct(VocabulariesInterface $vocabularies)
+ 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 59 of file StreamDelivery.php.

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

63  : never {
64  $this->deliver(
65  $stream,
67  $mime_type,
68  Disposition::ATTACHMENT
69  );
70  }
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 85 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().

90  : never {
91  $r = $this->http->response();
92  $uri = $stream->getMetadata()['uri'];
93 
94  if ($stream instanceof ZIPStream || $stream->getMetadata()['uri'] === 'php://memory') {
95  $this->response_builder = $this->fallback_response_builder;
96  }
97 
98  $r = $this->setGeneralHeaders(
99  $r,
100  $uri,
101  $mime_type ?? mime_content_type($uri),
104  );
105 
106  $r = $this->response_builder->buildForStream(
107  $this->http->request(),
108  $r,
109  $stream
110  );
111  $this->saveAndClose($r);
112  }
setGeneralHeaders(ResponseInterface $r, string $uri, string $mime_type, string $file_name, Disposition $disposition=Disposition::INLINE)
static http()
Fetches the global http state from ILIAS.
saveAndClose(ResponseInterface $r, string $path_to_delete=null)
$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 114 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(), ILIAS\Filesystem\Stream\Streams\ofFileInsideZIP(), ILIAS\Filesystem\Stream\Streams\ofResource(), and ILIAS\FileDelivery\Delivery\BaseDelivery\setGeneralHeaders().

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

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

206  : string
207  {
208  $suffix = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
209  if (isset($this->mime_type_map[$suffix])) {
210  if (is_array($this->mime_type_map[$suffix]) && isset($this->mime_type_map[$suffix][0])) {
211  return $this->mime_type_map[$suffix][0];
212  }
213 
214  return $this->mime_type_map[$suffix];
215  }
216 
217  $mime_type = mime_content_type($filename);
218  if ($mime_type === 'application/octet-stream') {
219  $mime_type = mime_content_type(substr($filename, 64));
220  }
221  return $mime_type ?: 'application/octet-stream';
222  }
$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 72 of file StreamDelivery.php.

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

76  : never {
77  $this->deliver(
78  $stream,
80  $mime_type,
81  Disposition::INLINE
82  );
83  }
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 52 of file StreamDelivery.php.

References ILIAS\FileDelivery\http().

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

52  : void
53  {
54  $this->http->saveResponse($r->withStatus(404));
55  $this->http->sendResponse();
56  $this->http->close();
57  }
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: