ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
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.

48 {
49 parent::__construct($http, $response_builder, $fallback_response_builder);
50 }
$http
Definition: deliver.php:30
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc

References $http, and ILIAS\GlobalScreen\Provider\__construct().

+ 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.

66 : never {
67 $this->deliver(
68 $stream,
71 Disposition::ATTACHMENT
72 );
73 }
deliver(FileStream $stream, string $download_file_name, ?string $mime_type=null, Disposition $disposition=Disposition::INLINE)

◆ 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.

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.

◆ deliverFromToken()

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

Definition at line 117 of file StreamDelivery.php.

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,
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,
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 }
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
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
$token
Definition: xapitoken.php:70

References $parts, $payload, $token, and ILIAS\FileDelivery\http().

+ 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.

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

References $filename.

◆ inline()

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

Definition at line 75 of file StreamDelivery.php.

79 : never {
80 $this->deliver(
81 $stream,
84 Disposition::INLINE
85 );
86 }

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

+ Here is the call graph for this function:

◆ notFound()

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

ILIAS\HTTP\Response\Sender\ResponseSendingException

Definition at line 55 of file StreamDelivery.php.

55 : void
56 {
57 $this->http->saveResponse($r->withStatus(404));
58 $this->http->sendResponse();
59 $this->http->close();
60 }

References ILIAS\FileDelivery\http().

+ Here is the call 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: