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

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
48 if ($request->getMethod() === 'HEAD') {
49 return $response->withStatus(200);
50 }
51
52 if (isset($server_params['HTTP_RANGE']) && $this->supportPartial()) {
53 return $this->deliverPartial($request, $response, $stream);
54 }
55 return $this->deliverFull($response, $stream);
56 }
deliverFull(ResponseInterface $response, FileStream $stream,)
buildHeaders(ResponseInterface $response, FileStream $stream)
deliverPartial(RequestInterface|ServerRequestInterface $request, ResponseInterface $response, FileStream $stream,)
$response
Definition: xapitoken.php:93

References $response.

◆ buildHeaders()

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

Definition at line 58 of file PHPResponseBuilder.php.

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

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

◆ deliverFull()

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

Definition at line 79 of file PHPResponseBuilder.php.

82 : ResponseInterface {
83 $stream->rewind();
84 return $response->withBody($stream);
85 }

◆ deliverPartial()

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

Definition at line 87 of file PHPResponseBuilder.php.

91 : ResponseInterface {
92 if (!$this->supportPartial()) {
93 return $response;
94 }
95 $request->getServerParams();
96
97 $start = 0;
98 $content_length = $stream->getSize();
99 $end = null;
100
101 $range_header = $request->getHeaderLine('Range');
102
103 if ($range_header && preg_match(
104 '%bytes=(\d+)-(\d+)?%i',
105 $range_header,
106 $match
107 )) {
108 $start = (int) $match[1];
109 if (isset($match[2])) {
110 $end = (int) $match[2];
111 }
112 $end ??= $content_length - 1;
113 }
114
115 $response = $response->withStatus(206);
116
117 $length = $end - $start + 1;
118 $fh = $stream->detach();
119
120 // set $buffer_size to 8MB
121 $buffer_size = 8048 * 1000; // 8,048,000 bytes
122
123 $output_length = 0;
124 if ($stream->isSeekable()) {
125 fseek($fh, $start);
126 while (!feof($fh) && $length > 0) {
127 $chunk_size_requested = min($buffer_size, $end - $start);
128 $content = fread($fh, $length);
129 if ($content === false) {
130 break;
131 }
132 $length -= strlen($content);
133 $response->getBody()->write($content);
134 $output_length = strlen($content);
135 }
136 } else {
137 $length = $buffer_size;
138 $content = stream_get_contents($fh, $length, $start);
139 $output_length = strlen($content);
140 $response = $response->withBody(
141 Streams::ofString($content)
142 );
143 $end = $start + $output_length - 1;
144 }
145
146 $response = $response->withHeader(
148 "bytes {$start}-{$end}/{$content_length}"
149 );
150
151 return $response->withHeader(ResponseHeader::CONTENT_LENGTH, $output_length);
152 }
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41

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 }

◆ supportFileDeletion()

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

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 164 of file PHPResponseBuilder.php.

164 : bool
165 {
166 return true;
167 }

◆ supportPartial()

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

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 154 of file PHPResponseBuilder.php.

154 : bool
155 {
156 return true;
157 }

◆ supportsAttachmentDelivery()

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

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 174 of file PHPResponseBuilder.php.

174 : bool
175 {
176 return true;
177 }

◆ supportsInlineDelivery()

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

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 169 of file PHPResponseBuilder.php.

169 : bool
170 {
171 return true;
172 }

◆ supportStreaming()

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

Implements ILIAS\FileDelivery\Delivery\ResponseBuilder\ResponseBuilder.

Definition at line 159 of file PHPResponseBuilder.php.

159 : bool
160 {
161 return true;
162 }

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