Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 43 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 1 |
ServeConvertedWebPWithErrorHandling | |
0.00% |
0 / 43 |
|
0.00% |
0 / 4 |
210 | |
0.00% |
0 / 1 |
processOptions | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
6 | |||
addHeadersPreventingCaching | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
2 | |||
performFailAction | |
0.00% |
0 / 21 |
|
0.00% |
0 / 1 |
72 | |||
serve | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
12 |
1 | <?php |
2 | namespace WebPConvert\Serve; |
3 | |
4 | use WebPConvert\Helpers\InputValidator; |
5 | use WebPConvert\Options\Options; |
6 | use WebPConvert\Options\StringOption; |
7 | use WebPConvert\Serve\Header; |
8 | use WebPConvert\Serve\Report; |
9 | use WebPConvert\Serve\ServeConvertedWeb; |
10 | use WebPConvert\Serve\Exceptions\ServeFailedException; |
11 | use WebPConvert\Exceptions\WebPConvertException; |
12 | |
13 | /** |
14 | * Serve a converted webp image and handle errors. |
15 | * |
16 | * @package WebPConvert |
17 | * @author Bjørn Rosell <it@rosell.dk> |
18 | * @since Class available since Release 2.0.0 |
19 | */ |
20 | class ServeConvertedWebPWithErrorHandling |
21 | { |
22 | |
23 | /** |
24 | * Process options. |
25 | * |
26 | * @throws \WebPConvert\Options\Exceptions\InvalidOptionTypeException If the type of an option is invalid |
27 | * @throws \WebPConvert\Options\Exceptions\InvalidOptionValueException If the value of an option is invalid |
28 | * @param array $options |
29 | */ |
30 | private static function processOptions($options) |
31 | { |
32 | $options2 = new Options(); |
33 | $options2->addOptions( |
34 | new StringOption('fail', 'original', ['original', '404', 'throw', 'report']), |
35 | new StringOption('fail-when-fail-fails', 'throw', ['original', '404', 'throw', 'report']) |
36 | ); |
37 | foreach ($options as $optionId => $optionValue) { |
38 | $options2->setOrCreateOption($optionId, $optionValue); |
39 | } |
40 | $options2->check(); |
41 | return $options2->getOptions(); |
42 | } |
43 | |
44 | /** |
45 | * Add headers for preventing caching. |
46 | * |
47 | * @return void |
48 | */ |
49 | private static function addHeadersPreventingCaching() |
50 | { |
51 | Header::setHeader("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); |
52 | Header::addHeader("Cache-Control: post-check=0, pre-check=0"); |
53 | Header::setHeader("Pragma: no-cache"); |
54 | } |
55 | |
56 | /** |
57 | * Perform fail action. |
58 | * |
59 | * @param string $fail Action to perform (original | 404 | report) |
60 | * @param string $failIfFailFails Action to perform if $fail action fails |
61 | * @param string $source path to source file |
62 | * @param string $destination path to destination |
63 | * @param array $options (optional) options for serving/converting |
64 | * @param \Exception $e exception that was thrown when trying to serve |
65 | * @param string $serveClass (optional) Full class name to a class that has a serveOriginal() method |
66 | * @return void |
67 | */ |
68 | public static function performFailAction($fail, $failIfFailFails, $source, $destination, $options, $e, $serveClass) |
69 | { |
70 | self::addHeadersPreventingCaching(); |
71 | |
72 | Header::addLogHeader('Performing fail action: ' . $fail); |
73 | |
74 | switch ($fail) { |
75 | case 'original': |
76 | try { |
77 | //ServeConvertedWebP::serveOriginal($source, $options); |
78 | call_user_func($serveClass . '::serveOriginal', $source, $options); |
79 | } catch (\Exception $e) { |
80 | self::performFailAction($failIfFailFails, '404', $source, $destination, $options, $e, $serveClass); |
81 | } |
82 | break; |
83 | |
84 | case '404': |
85 | $protocol = isset($_SERVER["SERVER_PROTOCOL"]) ? $_SERVER["SERVER_PROTOCOL"] : 'HTTP/1.0'; |
86 | Header::setHeader($protocol . " 404 Not Found"); |
87 | break; |
88 | |
89 | case 'report': |
90 | $options['show-report'] = true; |
91 | Report::convertAndReport($source, $destination, $options); |
92 | break; |
93 | |
94 | case 'throw': |
95 | throw $e; |
96 | //break; commented out as phpstan complains. But do something else complain now? |
97 | |
98 | case 'report-as-image': |
99 | // TODO: Implement or discard ? |
100 | break; |
101 | } |
102 | } |
103 | |
104 | /** |
105 | * Serve webp image and handle errors as specified in the 'fail' option. |
106 | * |
107 | * This method basically wraps ServeConvertedWebP:serve in order to provide exception handling. |
108 | * The error handling is set with the 'fail' option and can be either '404', 'original' or 'report'. |
109 | * If set to '404', errors results in 404 Not Found headers being issued. If set to 'original', an |
110 | * error results in the original being served. |
111 | * Look up the ServeConvertedWebP:serve method to learn more. |
112 | * |
113 | * @param string $source path to source file |
114 | * @param string $destination path to destination |
115 | * @param array $options (optional) options for serving/converting |
116 | * Supported options: |
117 | * - 'fail' => (string) Action to take on failure (404 | original | report | throw). |
118 | * "404" or "throw" is recommended for development and "original" is recommended for production. |
119 | * Default: 'original'. |
120 | * - 'fail-when-fail-fails' => (string) Action to take if fail action also fails. Default: '404'. |
121 | * - All options supported by WebPConvert::convert() |
122 | * - All options supported by ServeFile::serve() |
123 | * - All options supported by DecideWhatToServe::decide) |
124 | * @param \WebPConvert\Loggers\BaseLogger $serveLogger (optional) |
125 | * @param \WebPConvert\Loggers\BaseLogger $convertLogger (optional) |
126 | * @param string $serveClass (optional) Full class name to a class that has a serve() method and a |
127 | * serveOriginal() method |
128 | * @return void |
129 | */ |
130 | public static function serve( |
131 | $source, |
132 | $destination, |
133 | $options = [], |
134 | $serveLogger = null, |
135 | $convertLogger = null, |
136 | $serveClass = '\\WebPConvert\\Serve\\ServeConvertedWebP' |
137 | ) { |
138 | |
139 | $options = self::processOptions($options); |
140 | try { |
141 | InputValidator::checkSourceAndDestination($source, $destination); |
142 | //ServeConvertedWebP::serve($source, $destination, $options, $serveLogger); |
143 | call_user_func($serveClass . '::serve', $source, $destination, $options, $serveLogger, $convertLogger); |
144 | } catch (\Exception $e) { |
145 | if ($e instanceof \WebPConvert\Exceptions\WebPConvertException) { |
146 | Header::addLogHeader($e->getShortMessage(), $serveLogger); |
147 | } |
148 | |
149 | self::performFailAction( |
150 | $options['fail'], |
151 | $options['fail-when-fail-fails'], |
152 | $source, |
153 | $destination, |
154 | $options, |
155 | $e, |
156 | $serveClass |
157 | ); |
158 | } |
159 | } |
160 | } |