> On Sep 9, 2016, at 10:15 AM, Susan Hinrichs > <shinr...@network-geographics.com> wrote: > > > > On 9/9/2016 12:01 PM, James Peach wrote: >>> On Sep 9, 2016, at 9:39 AM, Susan Hinrichs >>> <shinr...@network-geographics.com> 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. >>>> >>>> >>>> >>> > >