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

Reply via email to