# API: The WebPConvert::convertAndServe() method
*NOTE:* In 2.0, the method is renamed to *serveConverted* ("convertAndServe" was implying that a conversion was always made, but the method simply serves destination if it exists and is smaller and newer than source)
The method tries to serve a converted image. If destination already exists, the already converted image will be served. Unless the original is newer or smaller. If the method fails, it will serve original image, a 404, or whatever the 'fail' option is set to.
**WebPConvert::convertAndServe($source, $destination, $options)**
| Parameter | Type | Description |
| ---------------- | ------- | ------------------------------------------------------------------- |
| `$source` | String | Absolute path to source image (only forward slashes allowed) |
| `$destination` | String | Absolute path to converted image (only forward slashes allowed) |
| `$options` | Array | Array of options (see below) |
## The *$options* argument
The options argument is a named array. Besides the options described below, you can also use any options that the *convert* method takes (if a fresh convertion needs to be created, this method will call the *convert* method and hand over the options argument)
### *convert*
Conversion options, handed over to the convert method, in case a conversion needs to be made. The convert options are documented [here](https://github.com/rosell-dk/webp-convert/blob/master/docs/v2.0/converting/options.md).
### *fail*
Indicate what to do, in case of normal conversion failure.
Default value: *"original"*
| Possible values | Meaning |
| ----------------- | ----------------------------------------------- |
| "serve-original" | Serve the original image. |
| "404" | Serve 404 status (not found) |
| "report-as-image" | Serve an image with text explaining the problem |
| "report" | Serve a textual report explaining the problem |
### *fail-when-original-unavailable*
Possible values: Same as above, except that "original" is not an option.
Default value: *"404"*
### *show-report*
Produce a report rather than serve an image.
Default value: *false*
### *reconvert*
Force a conversion, discarding existing converted image (if any).
Default value: *false*
### *serve-original*
Forces serving original image. This will skip conversion.
Default value: *false*
### *add-x-header-status*
When set to *true*, a *X-WebP-Convert-Status* header will be added describing how things went.
Default value: *true*
Depending on how things goes, the header will be set to one of the following:
- "Failed (missing source argument)"
- "Failed (source not found)""
- "Failed (missing destination argument)"
- "Reporting..."
- "Serving original image (was explicitly told to)"
- "Serving original image - because it is smaller than the converted!"
- "Serving freshly converted image (the original had changed)"
- "Serving existing converted image"
- "Converting image (handed over to WebPConvertAndServe)"
- "Serving freshly converted image"
- "Failed (could not convert image)"
### *add-vary-header*
Add a "Vary: Accept" header when an image is served. Experimental.
Default value: *true*
### *add-content-type-header*
Add a "Content-Type" header
Default value: *true*
If set, a *Content-Type* header will be added. It will be set to "image/webp" if a converted image is served, "image/jpeg" or "image/png", if the original is served or "image/gif", if an error message is served (as image). You can set it to false when debugging (to check if any errors are being outputted)
### *add-last-modified-header*
Add a "Last-Modified" header
Default value: *true*
If set, a *Last-Modified* header will be added. When a cached image is served, it will be set to the modified time of the converted file. When a fresh image is served, it is set to current time.
### *cache-control-header*
Specify a cache control header, which will be served when caching is appropriate.
Default value: "public, max-age=86400" (1 day)
Caching is "deemed appropriate", when destination is served, source is served, because it is lighter or a fresh conversion is made, due to there not being any converted image at the destination yet. Caching is not deemed appropriate when something fails, a report is requested, or the *reconvert* option have been set. Note: in version 1.3.2 and below, the *serve-original* option also prevented caching, but it no longer does. previous In those cases, standard headers will be used for preventing caching.
For your convenience, here is a little table:
| duration | max-age |
| -------- | ---------------- |
| 1 second | max-age=1 |
| 1 minute | max-age=60 |
| 1 hour | max-age=3600 |
| 1 day | max-age=86400 |
| 1 week | max-age=604800 |
| 1 month | max-age=2592000 |
| 1 year | max-age=31536000 |
To learn about the options for the Cache-Control header, go [here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)
### *error-reporting*
Set error reporting
Allowed values: *"auto"*, *"dont-mess"*, *true*, *false*
Default value: *"auto"*
If set to true, error reporting will be turned on, like this:
```
error_reporting(E_ALL);
ini_set('display_errors', 'On');
```
If set to false, error reporting will be turned off, like this:
```
error_reporting(0);
ini_set('display_errors', 'Off');
```
If set to "auto", errors will be turned off, unless the `show-report` option is set, in which case errors will be turned off.
If set to "dont-mess", error reporting will not be touched.
### *aboutToServeImageCallBack*
This callback is called right before response headers and image is served. This is a great chance to adding headers. You can stop the image and the headers from being served by returning *false*.
**Arguments:**
The first argument to the callback contains a string that tells what is about to be served. It can be 'fresh-conversion', 'destination' or 'source'.
The second argument tells you why that is served. It can be one of the following:
for 'source':
- "explicitly-told-to" (when the "serve-original" option is set)
- "source-lighter" (when original image is actually smaller than the converted)
for 'fresh-conversion':
- "explicitly-told-to" (when the "reconvert" option is set)
- "source-modified" (when source is newer than existing)
- "no-existing" (when there is no existing at the destination)
for 'destination':
- "no-reason-not-to" (it is lighter than source, its not older, and we were not told to do otherwise)
Example of callback:
```
function aboutToServeImageCallBack($servingWhat, $whyServingThis, $obj)
{
echo 'about to serve: ' . $servingWhat . '
';
echo 'Why? - because: ' . $whyServingThis;
return false; // Do not serve! (this also prevents any response headers from being added)
}
```
### *aboutToPerformFailActionCallback*
This callback is called right before doing the action specified in the `fail` option, or the `fail-when-original-unavailable` option. You can stop the fail action from being executod by returning *false*.
Documentation by example:
```
function aboutToPerformFailActionCallback($errorTitle, $errorDescription, $actionAboutToBeTaken, $serveConvertedObj)
{
echo '