|  | .. Licensed to the Apache Software Foundation (ASF) under one | 
|  | or more contributor license agreements.  See the NOTICE file | 
|  | distributed with this work for additional information | 
|  | regarding copyright ownership.  The ASF licenses this file | 
|  | to you under the Apache License, Version 2.0 (the | 
|  | "License"); you may not use this file except in compliance | 
|  | with the License.  You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, | 
|  | software distributed under the License is distributed on an | 
|  | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | KIND, either express or implied.  See the License for the | 
|  | specific language governing permissions and limitations | 
|  | under the License. | 
|  |  | 
|  |  | 
|  | .. include:: ../../common.defs | 
|  |  | 
|  | .. _admin-plugins-cache-range-requests: | 
|  |  | 
|  |  | 
|  | Cache Range Requests Plugin | 
|  | *************************** | 
|  |  | 
|  | Description | 
|  | =========== | 
|  |  | 
|  | Most origin servers support HTTP/1.1 range requests (rfc 7233). | 
|  | ATS internally handles range request caching in one of 2 ways: | 
|  |  | 
|  | * Don't cache range requests. | 
|  | * Only server range requests from a wholly cached object. | 
|  |  | 
|  | This plugin allows you to remap individual range requests so that they | 
|  | are stored as individual objects in the ATS cache when subsequent range | 
|  | requests are likely to use the same range.  This spreads range requests | 
|  | over multiple stripes thereby reducing I/O wait and system load averages. | 
|  |  | 
|  | :program:`cache_range_requests` reads the range request header byte range | 
|  | value and then creates a new ``cache key URL`` using the original request | 
|  | url with the range value appended to it.  The range header is removed | 
|  | where appropriate from the requests and the origin server response code | 
|  | is changed from a 206 to a 200 to insure that the object is written to | 
|  | cache using the new cache key url.  The response code sent to the client | 
|  | will be changed back to a 206 and all requests to the origin server will | 
|  | contain the range header so that the correct response is received. | 
|  |  | 
|  | The :program:`cache_range_requests` plugin by itself has no logic to | 
|  | efficiently manage overlapping ranges.  It is best to use this plugin | 
|  | in conjunction with a smart client that only requests predetermined | 
|  | non overlapping cache ranges (request blocking) or as a helper for the | 
|  | :program:`slice` plugin. | 
|  |  | 
|  | Only requests which contain the ``Range: <units>=`` GET header | 
|  | will be served by the :program:`cache_range_requests` plugin. | 
|  |  | 
|  | If/when ATS implements partial object caching this plugin will | 
|  | become deprecated. | 
|  |  | 
|  | *NOTE* Given a multi range request the :program:`cache_range_requests` | 
|  | only processes the first range and ignores the rest. | 
|  |  | 
|  | How to run the plugin | 
|  | ===================== | 
|  |  | 
|  | The plugin can run as a global plugin (a single global instance configured | 
|  | using :file:`plugin.config`) or as per-remap plugin (a separate instance | 
|  | configured per remap rule in :file:`remap.config`). | 
|  |  | 
|  | Global instance | 
|  | --------------- | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | $ cat plugin.config | 
|  | cache_range_requests.so | 
|  |  | 
|  |  | 
|  | Per-remap instance | 
|  | ------------------ | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | $cat remap.config | 
|  | map http://www.example.com http://www.origin.com \ | 
|  | @plugin=cache_range_requests.so | 
|  |  | 
|  |  | 
|  | If both global and per-remap instance are used the per-remap configuration | 
|  | would take precedence (per-remap configuration would be applied and the | 
|  | global configuration ignored). | 
|  |  | 
|  | Plugin options | 
|  | ============== | 
|  |  | 
|  |  | 
|  | Parent Selection as Cache Key | 
|  | ----------------------------- | 
|  |  | 
|  | .. option:: --ps-cachekey | 
|  | .. option:: -p | 
|  |  | 
|  | Without this option parent selection is based solely on the hash of a | 
|  | URL Path a URL is requested from the same upstream parent cache listed | 
|  | in parent.config | 
|  |  | 
|  |  | 
|  | With this option parent selection is based on the full ``cache key URL`` | 
|  | which includes information about the partial content range.  In this mode, | 
|  | all requests (include partial content) will use consistent hashing method | 
|  | for parent selection. | 
|  |  | 
|  |  | 
|  | X-Crr-Ims header support | 
|  | ------------------------ | 
|  |  | 
|  | .. option:: --consider-ims | 
|  | .. option:: -c | 
|  | .. option:: --ims-header=[header name] (default: X-Crr-Ims) | 
|  | .. option:: -i | 
|  |  | 
|  | To support slice plugin self healing an option to force revalidation | 
|  | after cache lookup complete was added.  This option is triggered by a | 
|  | special header: | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | X-Crr-Ims: Tue, 19 Nov 2019 13:26:45 GMT | 
|  |  | 
|  | When this header is provided and a `cache hit fresh` is encountered the | 
|  | ``Date`` header of the object in cache is compared to this header date | 
|  | value.  If the cache date is *less* than this IMS date then the object | 
|  | is marked as STALE and an appropriate If-Modified-Since or If-Match | 
|  | request along with this X-Crr-Ims header is passed up to the parent. | 
|  |  | 
|  | In order for this to properly work in a CDN each cache in the | 
|  | chain *SHOULD* also contain a remap rule with the | 
|  | :program:`cache_range_requests` plugin with this option set. | 
|  |  | 
|  | When used with the :program:`slice` plugin its `--crr-ims-header` | 
|  | option must have the same value (or not be defined) in order to work. | 
|  |  | 
|  | Presence of the `--ims-header` automatically sets the `--consider-ims` option. | 
|  |  | 
|  | Don't modify the Cache Key | 
|  | -------------------------- | 
|  |  | 
|  | .. option:: --no-modify-cachekey | 
|  | .. option:: -n | 
|  |  | 
|  | With each transaction TSCacheUrlSet may only be called once.  When | 
|  | using the `cache_range_requests` plugin in conjunction with the | 
|  | `cachekey` plugin the option `--include-headers=Range` should be | 
|  | added as a `cachekey` parameter with this option.  Configuring this | 
|  | incorrectly *WILL* result in cache poisoning. | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | map http://ats/ http://parent/ \ | 
|  | @plugin=cachekey.so @pparam=--include-headers=Range \ | 
|  | @plugin=cache_range_requests.so @pparam=--no-modify-cachekey | 
|  |  | 
|  | *Without this `cache_range_requests` plugin option* | 
|  |  | 
|  | *IF* the TSCacheUrlSet call in cache_range_requests fails, an error is | 
|  | generated in the logs and the cache_range_requests plugin will disable | 
|  | transaction caching in order to avoid cache poisoning. | 
|  |  | 
|  | Verify Cacheability | 
|  | ------------------- | 
|  |  | 
|  | .. option:: --verify-cacheability | 
|  | .. option:: -v | 
|  |  | 
|  | This option causes the plugin to verify whether the requested object is | 
|  | cacheable. | 
|  |  | 
|  | By default, an object's cacheability is not verified after | 
|  | the plugin changes the response code of the upstream response from 206 | 
|  | to 200 to force the object into cache. When this option is enabled, | 
|  | cacheability is considered, and if the object is not cacheable, the | 
|  | status code is reset back to 206, which leads to the object not being cached. | 
|  |  | 
|  | This option is useful when used with other plugins, such as Cache Promote. | 
|  |  | 
|  | Cache Complete Responses | 
|  | ------------------------ | 
|  |  | 
|  | .. option:: --cache-complete-responses | 
|  | .. option:: -r | 
|  |  | 
|  | This option causes the plugin to cache complete responses (200 OK). By default, | 
|  | only 206 Partial Content responses are cached by this plugin; without this flag, | 
|  | any 200 OK observed will be marked as not cacheable. | 
|  |  | 
|  | This option is intended to cover the case when an origin responds with a 200 OK | 
|  | when the requested range exceeds the size of the object. For example, if an object | 
|  | is 500 bytes, and the requested range is for bytes 0-5000, some origins will | 
|  | respond with a 206 and a `Content-Range` header, while others may respond with a | 
|  | 200 OK and no `Content-Range` header. The same origin that responds with a 200 OK | 
|  | when the requested range exceeds the object size will serve 206s when the range is | 
|  | smaller than or within the bytes of the object. | 
|  |  | 
|  | **NOTE:** This option *should be used carefully* with full knowledge of how | 
|  | cache keys are set for a given remap rule that relies on this behavior and origin | 
|  | response mechanics. For example, when this option is the sole argument to | 
|  | `cache_range_requests.so` and no other plugins are in use, the behavior could be | 
|  | abused, especially if the origin always responds with 200 OKs. This is because | 
|  | the plugin will automatically include the requested `Range` in the cache key. | 
|  | This means that arbitrary ranges can be used to pollute the cache with different | 
|  | combinations of ranges, which will lead to many copies of the same complete object | 
|  | stored under different cache keys. | 
|  |  | 
|  | For this reason, if the plugin is instructed to cache complete responses, `Range` | 
|  | request headers coming into the remap should ideally be normalized. Normalization | 
|  | can be accomplished by using the slice plugin *without* the `--ref-relative` argument | 
|  | which is disabled by default. The cache key plugin can also be used to tightly control | 
|  | the construction of the cache key itself. | 
|  |  | 
|  | The preferred means of using this plugin option is with the following plugins: | 
|  | - slice to normalize the requested ranges, *without* the `--ref-relative` option | 
|  | - cachekey to control the cache key, including the `Range` header normalized by slice | 
|  | - cache range requests with `--no-modify-cachekey` and `--cache-complete-responses` | 
|  |  | 
|  | Configuration examples | 
|  | ====================== | 
|  |  | 
|  | Global plugin | 
|  | ------------- | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | cache_range_requests.so --ps-cachekey --consider-ims --no-modify-cachekey | 
|  |  | 
|  | or | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | cache_range_requests.so -p -c -n | 
|  |  | 
|  | Remap plugin | 
|  | ------------ | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | map http://ats http://parent @plugin=cache_range_requests.so @pparam=--ps-cachekey @pparam=--consider-ims @pparam=--no-modify-cachekey | 
|  |  | 
|  | or | 
|  |  | 
|  | .. code:: | 
|  |  | 
|  | map http://ats http://parent @plugin=cache_range_requests.so @pparam=-p @pparam=-c @pparam=-n |