nghttp2_select_next_protocol ============================ Synopsis -------- *#include * .. function:: int nghttp2_select_next_protocol(unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen) A helper function for dealing with NPN in client side or ALPN in server side. The *in* contains peer's protocol list in preferable order. The format of *in* is length-prefixed and not null-terminated. For example, ``h2`` and ``http/1.1`` stored in *in* like this:: in[0] = 2 in[1..2] = "h2" in[3] = 8 in[4..11] = "http/1.1" inlen = 12 The selection algorithm is as follows: 1. If peer's list contains HTTP/2 protocol the library supports, it is selected and returns 1. The following step is not taken. 2. If peer's list contains ``http/1.1``, this function selects ``http/1.1`` and returns 0. The following step is not taken. 3. This function selects nothing and returns -1 (So called non-overlap case). In this case, *out* and *outlen* are left untouched. Selecting ``h2`` means that ``h2`` is written into *\*out* and its length (which is 2) is assigned to *\*outlen*. For ALPN, refer to https://tools.ietf.org/html/rfc7301 See http://technotes.googlecode.com/git/nextprotoneg.html for more details about NPN. For NPN, to use this method you should do something like:: static int select_next_proto_cb(SSL* ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg) { int rv; rv = nghttp2_select_next_protocol(out, outlen, in, inlen); if (rv == -1) { return SSL_TLSEXT_ERR_NOACK; } if (rv == 1) { ((MyType*)arg)->http2_selected = 1; } return SSL_TLSEXT_ERR_OK; } ... SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, my_obj);