h2load: Support ALPN
This commit is contained in:
parent
fa4f03525e
commit
bded1d1115
|
@ -462,33 +462,42 @@ void eventcb(bufferevent *bev, short events, void *ptr)
|
||||||
unsigned int next_proto_len;
|
unsigned int next_proto_len;
|
||||||
SSL_get0_next_proto_negotiated(client->ssl,
|
SSL_get0_next_proto_negotiated(client->ssl,
|
||||||
&next_proto, &next_proto_len);
|
&next_proto, &next_proto_len);
|
||||||
|
for(int i = 0; i < 2; ++i) {
|
||||||
|
if(next_proto) {
|
||||||
|
if(util::check_h2_is_selected(next_proto, next_proto_len)) {
|
||||||
|
client->session = util::make_unique<Http2Session>(client);
|
||||||
|
} else {
|
||||||
|
#ifdef HAVE_SPDYLAY
|
||||||
|
auto spdy_version = spdylay_npn_get_version(next_proto,
|
||||||
|
next_proto_len);
|
||||||
|
if(spdy_version) {
|
||||||
|
client->session = util::make_unique<SpdySession>(client,
|
||||||
|
spdy_version);
|
||||||
|
} else {
|
||||||
|
debug_nextproto_error();
|
||||||
|
client->fail();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else // !HAVE_SPDYLAY
|
||||||
|
debug_nextproto_error();
|
||||||
|
client->fail();
|
||||||
|
return;
|
||||||
|
#endif // !HAVE_SPDYLAY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x10002000L
|
||||||
|
SSL_get0_alpn_selected(client->ssl, &next_proto, &next_proto_len);
|
||||||
|
#else // OPENSSL_VERSION_NUMBER < 0x10002000L
|
||||||
|
break;
|
||||||
|
#endif // OPENSSL_VERSION_NUMBER < 0x10002000L
|
||||||
|
}
|
||||||
|
|
||||||
if(!next_proto) {
|
if(!next_proto) {
|
||||||
debug_nextproto_error();
|
debug_nextproto_error();
|
||||||
client->fail();
|
client->fail();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(util::check_h2_is_selected(next_proto, next_proto_len)) {
|
|
||||||
client->session = util::make_unique<Http2Session>(client);
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_SPDYLAY
|
|
||||||
auto spdy_version = spdylay_npn_get_version(next_proto,
|
|
||||||
next_proto_len);
|
|
||||||
if(spdy_version) {
|
|
||||||
client->session = util::make_unique<SpdySession>(client,
|
|
||||||
spdy_version);
|
|
||||||
} else {
|
|
||||||
debug_nextproto_error();
|
|
||||||
client->fail();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else // !HAVE_SPDYLAY
|
|
||||||
debug_nextproto_error();
|
|
||||||
client->fail();
|
|
||||||
return;
|
|
||||||
#endif // !HAVE_SPDYLAY
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
switch(config.no_tls_proto) {
|
switch(config.no_tls_proto) {
|
||||||
case Config::PROTO_HTTP2:
|
case Config::PROTO_HTTP2:
|
||||||
|
@ -974,6 +983,16 @@ int main(int argc, char **argv)
|
||||||
SSL_CTX_set_next_proto_select_cb(ssl_ctx,
|
SSL_CTX_set_next_proto_select_cb(ssl_ctx,
|
||||||
client_select_next_proto_cb, nullptr);
|
client_select_next_proto_cb, nullptr);
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x10002000L
|
||||||
|
auto proto_list = util::get_default_alpn();
|
||||||
|
#ifdef HAVE_SPDYLAY
|
||||||
|
static const char spdy_proto_list[] = "\x8spdy/3.1\x6spdy/3\x6spdy/2";
|
||||||
|
std::copy(spdy_proto_list, spdy_proto_list + sizeof(spdy_proto_list) - 1,
|
||||||
|
std::back_inserter(proto_list));
|
||||||
|
#endif // HAVE_SPDYLAY
|
||||||
|
SSL_CTX_set_alpn_protos(ssl_ctx, proto_list.data(), proto_list.size());
|
||||||
|
#endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
|
||||||
|
|
||||||
std::vector<std::string> reqlines;
|
std::vector<std::string> reqlines;
|
||||||
|
|
||||||
if(config.ifile.empty()) {
|
if(config.ifile.empty()) {
|
||||||
|
|
Loading…
Reference in New Issue