> On Sep 9, 2016, at 9:39 AM, Susan Hinrichs <[email protected]>
> wrote:
>
> I'd like to propose a slight tweak for TSHttpTxnClientProtocolStackContains
> and TSHttpSsnClientProtocolStackContains
>
> Replace the tag argument with two explicit input and output arguments, e.g.
>
> int TSHttpTxnClientProtocolStackContains(TSHttpTxn txnp, char const
> *contains_tag, char const **specific_tag_ptr)
The TSHttpTxnClientProtocolStackContains didn't mention anything about any
output?
>
> I think having separate arguments for input and output arguments is clearer.
> Also if I don't care about getting a pointer back to the specific tag string
> that ATS uses internally I don't have to declare additional variables to make
> this call, e.g.
>
> if (TXHttpTxnClientProtocolStackContains(txnp, "h2", NULL)) {
> // Do HTTP/2 stuff
> }
>
> On 8/20/2016 10:20 AM, Alan Carroll wrote:
>> After discussions with Leif and Bryan, here is an updated proposal. This
>> would subsume Oliver Goodman's API, which would be simply calling this and
>> looking for / passing 'ws' as the protocol tag.
>> There is an unresolved point, which is the exact stack returned for a HTTP/2
>> connection.
>>
>> .. include:: ../../../common.defs
>>
>> .. default-domain:: c
>>
>> TSClientProtocolStack
>> *********************
>>
>> Synopsis
>> ========
>>
>> `#include <ts/ts.h>`
>>
>> .. function:: TSReturnCode TSHttpTxnClientProtocolStackGet(TSHttpTxn txnp,
>> int n, char const** result, int* actual)
>>
>> .. function:: TSReturnCode TSHttpSsnClientProtocolStackGet(TSHttpSsn ssnp,
>> int n, char const** result, int* actual)
>>
>> .. function:: int TSHttpTxnClientProtocolStackContains(TSHttpTxn txnp, char
>> const** tag)
>>
>> .. function:: int TSHttpSsnClientProtocolStackContains(TSHttpSsn ssnp, char
>> const** tag)
>>
>> .. function:: char const* TSNormalizedProtocolTag(char const* tag)
>>
>> .. function:: char const* TSRegisterProtocolTag(char const* tag)
>>
>> Description
>> ===========
>>
>> These functions are used to explore the protocol stack of the client (user
>> agent) connection to |TS|. The functions
>> :func:`TSHttpTxnClientProtocolStackGet` and
>> :func:`TSHttpSsnClientProtocolStackGet` can be used to retrieve the entire
>> protocol stack for the user agent connection.
>> :func:`TSHttpTxnClientProtocolStackContains` and
>> :func:`TSHttpSsnClientProtocolStackContains` will check for a specific
>> protocol :arg:`tag` being present in the stack.
>>
>> Each protocol is represented by tag which is a null terminated string. A
>> particular tag will always be returned as the same character pointer and so
>> protocols can be reliably checked with pointer comparisons.
>> :func:`TSNormalizedProtocolTag` will return this character pointer for a
>> specific :arg:`tag`. A return value of :const:`NULL` indicates the provided
>> :arg:`tag` is not registered as a known protocol tag.
>> :func:`TSRegisterProtocolTag` registers the :arg:`tag` and then returns its
>> normalized value. This is useful for plugins that provide custom protocols
>> for user agents.
>>
>> The protocols are ordered from higher level protocols to the lower level
>> ones on which the higher operate. For instance a stack might look like
>> "http/1.1,tls/1.2,tcp,ipv4". For :func:`TSHttpTxnClientProtocolStackGet` and
>> :func:`TSHttpSsnClientProtocolStackGet` these values are placed in the array
>> :arg:`result`. :arg:`count` is the maximum number of elements of
>> :arg:`result` that may be modified by the function call. If :arg:`actual` is
>> not :const:`NULL` then the actual number of elements in the protocol stack
>> will be returned. If this is equal or less than :arg:`count` then all
>> elements were returned. If it is larger then some layers were omitted from
>> :arg:`result`. If the full stack is required :arg:`actual` can be used to
>> resize :arg:`result` to be sufficient to hold all of the elements and the
>> function called again with updated :arg:`count` and :arg:`result`. In
>> practice the maximum number of elements will is almost certain to be less
>> than 10 which therefore should suffice. These functions return
>> :const:`TS_SUCCESS` on success and :const:`TS_ERROR` on failure which should
>> only occurr if :arg:`txnp` or :arg:`ssnp` are invalid.
>>
>> The :func:`TSHttpTxnClientProtocolStackContains` and
>> :func:`TSHttpSsnClientProtocolStackContains` functions are provided for the
>> convenience when only the presence of a protocol is of interest, not its
>> location or the presence of other protocols. These functions return 0 if the
>> protocol :arg:`tag` is not present, non-zero if it is present. The strings
>> are matched with an anchor prefix search, as with debug tags. For instance
>> if :arg:`tag` is "tls" then it will match "tls/1.2" or "tls/1.3". This makes
>> checking for TLS or IP more convenient. If more precision is required the
>> entire protocol stack can be retrieved and processed more thoroughly.
>>
>> The protocol tags defined by |TS|.
>>
>> =========== =========
>> Protocol Tag
>> =========== =========
>> HTTP/1.1 http/1.1
>> HTTP/1.0 http/1.0
>> HTTP/2 h2
>> WebSocket ws
>> TLS 1.3 tls/1.3
>> TLS 1.2 tls/1.2
>> TCP tcp
>> UDP udp
>> IPv4 ipv4
>> IPv6 ipv6
>> QUIC quic
>> =========== =========
>>
>> .. note::
>> What should HTTP/2 connections return as the top protocol? There are
>> several options
>> * "http/1.1,h2"
>> * "h2"
>> * "http/1.1,h2" for transctions and "h2" for sessions.
>>
>>
>>
>
>