.. 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

.. _developer-cache-api-functions:

API functions
*************

.. c:function:: void TSHttpTxnReqCacheableSet(TSHttpTxn txnp, int flag)

   Set a flag that marks a request as cacheable. This is a positive override
   only, setting :arg:`flag` to ``0`` restores the default behavior, it does not
   force the request to be uncacheable.

.. c:function:: TSReturnCode TSCacheUrlSet(TSHttpTxn txnp, char const* url, int length)

   Set the cache key for the transaction :arg:`txnp` as the string pointed at by
   :arg:`url` of :arg:`length` characters. It need not be NUL-terminated. This should
   be called from ``TS_HTTP_READ_REQUEST_HDR_HOOK`` which is before cache lookup
   but late enough that the HTTP request header is available.


The APIs that modify the cache key can be called as early as
``TS_HTTP_READ_REQUEST_HDR_HOOK`` but no later than
``TS_HTTP_POST_REMAP_HOOK``. The cache key is not only used for a cache lookup
before going to origin, but also to mark the intent to write to cache on an
origin response (if possible).

Cache Internals
===============

.. cpp:function:: int DIR_SIZE_WITH_BLOCK(int big)

   A preprocessor macro which computes the maximum size of a fragment based on
   the value of :arg:`big`. This is computed as if the argument where the value of
   the :arg:`big` field in a struct :cpp:class:`Dir`.

.. cpp:function:: int DIR_BLOCK_SIZE(int big)

   A preprocessor macro which computes the block size multiplier for a struct
   :cpp:class:`Dir` where :arg:`big` is the :arg:`big` field value.
