ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder Class Reference
+ Inheritance diagram for ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder:
+ Collaboration diagram for ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder:

Public Member Functions

 getName ()
 
 buildForStream (ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
 
 supportPartial ()
 
 supportStreaming ()
 
 supportFileDeletion ()
 
 supportsInlineDelivery ()
 
 supportsAttachmentDelivery ()
 
 getName ()
 
 buildForStream (ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
 
 supportStreaming ()
 
 supportPartial ()
 
 supportFileDeletion ()
 
 supportsInlineDelivery ()
 
 supportsAttachmentDelivery ()
 

Protected Member Functions

 buildHeaders (ResponseInterface $response, FileStream $stream)
 
 deliverFull (ResponseInterface $response, FileStream $stream,)
 
 deliverPartial (RequestInterface|ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
 

Private Member Functions

 parseRange (RequestInterface|ServerRequestInterface $request, FileStream $stream,)
 
 buildPartialHeaders (RequestInterface|ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
 

Detailed Description

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

Definition at line 33 of file PHPResponseBuilder.php.

Member Function Documentation

◆ buildForStream()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::buildForStream ( ServerRequestInterface  $request,
ResponseInterface  $response,
FileStream  $stream 
)

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 40 of file PHPResponseBuilder.php.

44 : ResponseInterface {
45 $response = $this->buildHeaders($response, $stream);
46 $server_params = $request->getServerParams();
47 $has_range = isset($server_params['HTTP_RANGE']) && $this->supportPartial();
48
49 if ($request->getMethod() === 'HEAD') {
50 if ($has_range) {
51 return $this->buildPartialHeaders($request, $response, $stream)
52 ->withBody(Streams::ofString(''));
53 }
54 return $response->withStatus(200);
55 }
56
57 if ($has_range) {
58 return $this->deliverPartial($request, $response, $stream);
59 }
60 return $this->deliverFull($response, $stream);
61 }
deliverFull(ResponseInterface $response, FileStream $stream,)
buildPartialHeaders(RequestInterface|ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
buildHeaders(ResponseInterface $response, FileStream $stream)
deliverPartial(RequestInterface|ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41
$request
@ilCtrl_Calls ilObjLearningSequenceContentGUI: ilObjLearningSequenceConditionsGUI
Definition: ltiauth.php:39
$response
Definition: xapitoken.php:92

◆ buildHeaders()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::buildHeaders ( ResponseInterface  $response,
FileStream  $stream 
)
protected

Definition at line 63 of file PHPResponseBuilder.php.

66 : ResponseInterface {
67 $uri = $stream->getMetadata('uri');
68 if ($this->supportPartial()) {
70 }
71
72 $response = $response->withHeader(ResponseHeader::CONTENT_LENGTH, $stream->getSize());
73 try {
74 $response = $response->withHeader(
76 date("D, j M Y H:i:s", @filemtime($uri) ?: time()) . " GMT"
77 );
78 } catch (\Throwable) {
79 }
80
81 return $response->withHeader(ResponseHeader::ETAG, md5((string) $uri));
82 }

References $response, and ILIAS\HTTP\Response\ResponseHeader\ACCEPT_RANGES.

◆ buildPartialHeaders()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::buildPartialHeaders ( RequestInterface|ServerRequestInterface  $request,
ResponseInterface  $response,
FileStream  $stream 
)
private

Definition at line 160 of file PHPResponseBuilder.php.

164 : ResponseInterface {
165 [$start, $end, $content_length] = $this->parseRange($request, $stream);
166
167 return $response
168 ->withStatus(206)
169 ->withHeader(ResponseHeader::CONTENT_RANGE, "bytes {$start}-{$end}/{$content_length}")
170 ->withHeader(ResponseHeader::CONTENT_LENGTH, (string) ($end - $start + 1));
171 }
parseRange(RequestInterface|ServerRequestInterface $request, FileStream $stream,)

◆ deliverFull()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::deliverFull ( ResponseInterface  $response,
FileStream  $stream 
)
protected

Definition at line 84 of file PHPResponseBuilder.php.

87 : ResponseInterface {
88 $stream->rewind();
89 return $response->withBody($stream);
90 }

◆ deliverPartial()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::deliverPartial ( RequestInterface|ServerRequestInterface  $request,
ResponseInterface  $response,
FileStream  $stream 
)
protected

Definition at line 92 of file PHPResponseBuilder.php.

96 : ResponseInterface {
97 if (!$this->supportPartial()) {
98 return $response;
99 }
100
101 [$start, $end, $content_length] = $this->parseRange($request, $stream);
102
103 $response = $response->withStatus(206);
104
105 $range_length = $end - $start + 1;
106 $fh = $stream->detach();
107
108 // 8 MiB read buffer
109 $buffer_size = 8 * 1024 * 1024;
110
111 if ($stream->isSeekable()) {
112 fseek($fh, $start);
113 $remaining = $range_length;
114 while (!feof($fh) && $remaining > 0) {
115 $content = fread($fh, min($buffer_size, $remaining));
116 if ($content === false) {
117 break;
118 }
119 $remaining -= strlen($content);
120 $response->getBody()->write($content);
121 }
122 $output_length = $range_length - $remaining;
123 } else {
124 $length = min($range_length, $buffer_size);
125 $content = stream_get_contents($fh, $length, $start);
126 $output_length = strlen($content);
127 $response = $response->withBody(
128 Streams::ofString($content)
129 );
130 $end = $start + $output_length - 1;
131 }
132
133 $response = $response->withHeader(
135 "bytes {$start}-{$end}/{$content_length}"
136 );
137
138 return $response->withHeader(ResponseHeader::CONTENT_LENGTH, $output_length);
139 }

References $response.

◆ getName()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::getName ( )

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 35 of file PHPResponseBuilder.php.

35 : string
36 {
37 return 'php';
38 }

◆ parseRange()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::parseRange ( RequestInterface|ServerRequestInterface  $request,
FileStream  $stream 
)
private

Definition at line 141 of file PHPResponseBuilder.php.

144 : array {
145 $content_length = $stream->getSize();
146 $start = 0;
147 $end = $content_length - 1;
148
149 $range_header = $request->getHeaderLine('Range');
150 if ($range_header && preg_match('%bytes=(\d+)-(\d+)?%i', $range_header, $match)) {
151 $start = (int) $match[1];
152 if (isset($match[2])) {
153 $end = (int) $match[2];
154 }
155 }
156
157 return [$start, $end, $content_length];
158 }

References ILIAS\Repository\int().

+ Here is the call graph for this function:

◆ supportFileDeletion()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::supportFileDeletion ( )

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 183 of file PHPResponseBuilder.php.

183 : bool
184 {
185 return true;
186 }

◆ supportPartial()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::supportPartial ( )

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 173 of file PHPResponseBuilder.php.

173 : bool
174 {
175 return true;
176 }

◆ supportsAttachmentDelivery()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::supportsAttachmentDelivery ( )

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 193 of file PHPResponseBuilder.php.

193 : bool
194 {
195 return true;
196 }

◆ supportsInlineDelivery()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::supportsInlineDelivery ( )

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 188 of file PHPResponseBuilder.php.

188 : bool
189 {
190 return true;
191 }

◆ supportStreaming()

ILIAS\FileDelivery\Delivery\ResponseBuilder\PHPResponseBuilder::supportStreaming ( )

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 178 of file PHPResponseBuilder.php.

178 : bool
179 {
180 return true;
181 }

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