src: Announce h2 ALPN

This commit is contained in:
Tatsuhiro Tsujikawa 2015-02-20 23:50:17 +09:00
parent 2fc1dd77d2
commit ab93a700ce
5 changed files with 32 additions and 16 deletions

View File

@ -636,7 +636,7 @@ bool conf_exists(const char *path) {
} // namespace } // namespace
namespace { namespace {
const char *DEFAULT_NPN_LIST = "h2-16," NGHTTP2_PROTO_VERSION_ID "," const char *DEFAULT_NPN_LIST = "h2,h2-16," NGHTTP2_PROTO_VERSION_ID ","
#ifdef HAVE_SPDYLAY #ifdef HAVE_SPDYLAY
"spdy/3.1," "spdy/3.1,"
#endif // HAVE_SPDYLAY #endif // HAVE_SPDYLAY

View File

@ -55,6 +55,10 @@ template <typename T, size_t N> constexpr size_t array_size(T (&)[N]) {
return N; return N;
} }
template <typename T, size_t N> constexpr size_t str_size(T (&)[N]) {
return N - 1;
}
// inspired by <http://blog.korfuri.fr/post/go-defer-in-cpp/>, but our // inspired by <http://blog.korfuri.fr/post/go-defer-in-cpp/>, but our
// template can take functions returning other than void. // template can take functions returning other than void.
template <typename F, typename... T> struct Defer { template <typename F, typename... T> struct Defer {

View File

@ -44,6 +44,7 @@
#include <nghttp2/nghttp2.h> #include <nghttp2/nghttp2.h>
#include "timegm.h" #include "timegm.h"
#include "template.h"
namespace nghttp2 { namespace nghttp2 {
@ -756,9 +757,9 @@ int64_t to_time64(const timeval &tv) {
} }
bool check_h2_is_selected(const unsigned char *proto, size_t len) { bool check_h2_is_selected(const unsigned char *proto, size_t len) {
return streq(NGHTTP2_PROTO_VERSION_ID, NGHTTP2_PROTO_VERSION_ID_LEN, proto, return streq_l(NGHTTP2_H2, proto, len) ||
len) || streq_l(NGHTTP2_H2_16, proto, len) ||
streq(NGHTTP2_H2_16_ID, NGHTTP2_H2_16_ID_LEN, proto, len); streq_l(NGHTTP2_PROTO_VERSION_ID, proto, len);
} }
namespace { namespace {
@ -778,19 +779,23 @@ bool select_h2(const unsigned char **out, unsigned char *outlen,
bool select_h2(const unsigned char **out, unsigned char *outlen, bool select_h2(const unsigned char **out, unsigned char *outlen,
const unsigned char *in, unsigned int inlen) { const unsigned char *in, unsigned int inlen) {
return select_h2(out, outlen, in, inlen, NGHTTP2_H2_16_ALPN, return select_h2(out, outlen, in, inlen, NGHTTP2_H2_ALPN,
NGHTTP2_H2_16_ALPN_LEN) || str_size(NGHTTP2_H2_ALPN)) ||
select_h2(out, outlen, in, inlen, NGHTTP2_H2_16_ALPN,
str_size(NGHTTP2_H2_16_ALPN)) ||
select_h2(out, outlen, in, inlen, NGHTTP2_PROTO_ALPN, select_h2(out, outlen, in, inlen, NGHTTP2_PROTO_ALPN,
NGHTTP2_PROTO_ALPN_LEN); str_size(NGHTTP2_PROTO_ALPN));
} }
std::vector<unsigned char> get_default_alpn() { std::vector<unsigned char> get_default_alpn() {
auto res = std::vector<unsigned char>(NGHTTP2_PROTO_ALPN_LEN + auto res = std::vector<unsigned char>(str_size(NGHTTP2_PROTO_ALPN) +
NGHTTP2_H2_16_ALPN_LEN); str_size(NGHTTP2_H2_16_ALPN) +
str_size(NGHTTP2_H2_ALPN));
auto p = std::begin(res); auto p = std::begin(res);
p = std::copy_n(NGHTTP2_H2_16_ALPN, NGHTTP2_H2_16_ALPN_LEN, p); p = std::copy_n(NGHTTP2_H2_ALPN, str_size(NGHTTP2_H2_ALPN), p);
p = std::copy_n(NGHTTP2_PROTO_ALPN, NGHTTP2_PROTO_ALPN_LEN, p); p = std::copy_n(NGHTTP2_H2_16_ALPN, str_size(NGHTTP2_H2_16_ALPN), p);
p = std::copy_n(NGHTTP2_PROTO_ALPN, str_size(NGHTTP2_PROTO_ALPN), p);
return res; return res;
} }

View File

@ -48,9 +48,10 @@ namespace nghttp2 {
// supports for our applications. This will be removed once HTTP/2 // supports for our applications. This will be removed once HTTP/2
// specification is finalized. // specification is finalized.
#define NGHTTP2_H2_16_ALPN "\x5h2-16" #define NGHTTP2_H2_16_ALPN "\x5h2-16"
#define NGHTTP2_H2_16_ALPN_LEN (sizeof(NGHTTP2_H2_16_ALPN) - 1) #define NGHTTP2_H2_16 "h2-16"
#define NGHTTP2_H2_16_ID "h2-16"
#define NGHTTP2_H2_16_ID_LEN (sizeof(NGHTTP2_H2_16_ID) - 1) #define NGHTTP2_H2_ALPN "\x2h2"
#define NGHTTP2_H2 "h2"
namespace util { namespace util {
@ -322,6 +323,11 @@ bool streq(InputIt1 a, size_t alen, InputIt2 b, size_t blen) {
return std::equal(a, a + alen, b); return std::equal(a, a + alen, b);
} }
template <typename InputIt, size_t N>
bool streq_l(const char (&a)[N], InputIt b, size_t blen) {
return streq(a, N - 1, b, blen);
}
bool strifind(const char *a, const char *b); bool strifind(const char *a, const char *b);
// Lowercase |s| in place. // Lowercase |s| in place.

View File

@ -32,6 +32,7 @@
#include <nghttp2/nghttp2.h> #include <nghttp2/nghttp2.h>
#include "util.h" #include "util.h"
#include "template.h"
using namespace nghttp2; using namespace nghttp2;
@ -197,8 +198,8 @@ void test_util_select_h2(void) {
// picked up because it has precedence over the other. // picked up because it has precedence over the other.
const unsigned char t6[] = "\x5h2-14\x5h2-16"; const unsigned char t6[] = "\x5h2-14\x5h2-16";
CU_ASSERT(util::select_h2(&out, &outlen, t6, sizeof(t6) - 1)); CU_ASSERT(util::select_h2(&out, &outlen, t6, sizeof(t6) - 1));
CU_ASSERT(memcmp(NGHTTP2_H2_16_ID, out, NGHTTP2_H2_16_ID_LEN) == 0); CU_ASSERT(memcmp(NGHTTP2_H2_16, out, str_size(NGHTTP2_H2_16)) == 0);
CU_ASSERT(NGHTTP2_H2_16_ID_LEN == outlen); CU_ASSERT(str_size(NGHTTP2_H2_16) == outlen);
} }
void test_util_ipv6_numeric_addr(void) { void test_util_ipv6_numeric_addr(void) {