if(result)
goto fail;
info_version = "HTTP/2";
+ /* There is no ALPN here, but the connection is now definitely h2 */
+ conn->httpversion_seen = 20;
}
else
info_version = "HTTP/1.x";
and happy eyeballing. Use `Curl_conn_get_transport() for actual value
once the connection is set up. */
unsigned char ip_version; /* copied from the Curl_easy at creation time */
- /* HTTP version last responded with by the server.
+ /* HTTP version last responded with by the server or negotiated via ALPN.
* 0 at start, then one of 09, 10, 11, etc. */
unsigned char httpversion_seen;
unsigned char connect_only;
return CURLE_OK;
}
-static CURLcode cf_ngtcp2_data_event(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- int event, int arg1, void *arg2)
+static CURLcode cf_ngtcp2_cntrl(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ int event, int arg1, void *arg2)
{
struct cf_ngtcp2_ctx *ctx = cf->ctx;
CURLcode result = CURLE_OK;
}
break;
}
+ case CF_CTRL_CONN_INFO_UPDATE:
+ if(!cf->sockindex && cf->connected)
+ cf->conn->httpversion_seen = 30;
+ break;
default:
break;
}
Curl_cf_def_data_pending,
cf_ngtcp2_send,
cf_ngtcp2_recv,
- cf_ngtcp2_data_event,
+ cf_ngtcp2_cntrl,
cf_ngtcp2_conn_is_alive,
Curl_cf_def_conn_keep_alive,
cf_ngtcp2_query,
return stream && !Curl_bufq_is_empty(&stream->recvbuf);
}
-static CURLcode cf_osslq_data_event(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- int event, int arg1, void *arg2)
+static CURLcode cf_osslq_cntrl(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ int event, int arg1, void *arg2)
{
struct cf_osslq_ctx *ctx = cf->ctx;
CURLcode result = CURLE_OK;
}
break;
}
+ case CF_CTRL_CONN_INFO_UPDATE:
+ if(!cf->sockindex && cf->connected)
+ cf->conn->httpversion_seen = 30;
+ break;
default:
break;
}
cf_osslq_data_pending,
cf_osslq_send,
cf_osslq_recv,
- cf_osslq_data_event,
+ cf_osslq_cntrl,
cf_osslq_conn_is_alive,
Curl_cf_def_conn_keep_alive,
cf_osslq_query,
return CURLE_OK;
}
-static CURLcode cf_quiche_data_event(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- int event, int arg1, void *arg2)
+static CURLcode cf_quiche_cntrl(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ int event, int arg1, void *arg2)
{
struct cf_quiche_ctx *ctx = cf->ctx;
CURLcode result = CURLE_OK;
}
break;
}
+ case CF_CTRL_CONN_INFO_UPDATE:
+ if(!cf->sockindex && cf->connected)
+ cf->conn->httpversion_seen = 30;
+ break;
default:
break;
}
cf_quiche_data_pending,
cf_quiche_send,
cf_quiche_recv,
- cf_quiche_data_event,
+ cf_quiche_cntrl,
cf_quiche_conn_is_alive,
Curl_cf_def_conn_keep_alive,
cf_quiche_query,
CURLE_UNKNOWN_OPTION;
}
+static CURLcode ssl_cf_cntrl(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ int event, int arg1, void *arg2)
+{
+ struct ssl_connect_data *connssl = cf->ctx;
+
+ (void)arg1;
+ (void)arg2;
+ (void)data;
+ switch(event) {
+ case CF_CTRL_CONN_INFO_UPDATE:
+ if(connssl->negotiated.alpn && !cf->sockindex) {
+ if(!strcmp("http/1.1", connssl->negotiated.alpn))
+ cf->conn->httpversion_seen = 11;
+ else if(!strcmp("h2", connssl->negotiated.alpn))
+ cf->conn->httpversion_seen = 20;
+ else if(!strcmp("h3", connssl->negotiated.alpn))
+ cf->conn->httpversion_seen = 30;
+ }
+ break;
+ }
+ return CURLE_OK;
+}
+
static bool cf_ssl_is_alive(struct Curl_cfilter *cf, struct Curl_easy *data,
bool *input_pending)
{
ssl_cf_data_pending,
ssl_cf_send,
ssl_cf_recv,
- Curl_cf_def_cntrl,
+ ssl_cf_cntrl,
cf_ssl_is_alive,
Curl_cf_def_conn_keep_alive,
ssl_cf_query,