> On Sep 9, 2016, at 10:15 AM, Susan Hinrichs
> <[email protected]> wrote:
>
>
>
> On 9/9/2016 12:01 PM, James Peach wrote:
>>> 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 was assuming that something was being returned via the tag argument since
> we are passing in a pointer to a pointer.
It takes a nul-terminated array of tags right?
>
>>
>>> 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.
>>>>
>>>>
>>>>
>>>
>
>