mirror of
https://github.com/curl/curl.git
synced 2026-08-25 00:13:34 +03:00
lib: connect/h2/h3 refactor
Refactoring of connection setup and happy eyeballing. Move
nghttp2. ngtcp2, quiche and msh3 into connection filters.
- eyeballing cfilter that uses sub-filters for performing parallel connects
- socket cfilter for all transport types, including QUIC
- QUIC implementations in cfilter, can now participate in eyeballing
- connection setup is more dynamic in order to adapt to what filter did
really connect. Relevant to see if a SSL filter needs to be added or
if SSL has already been provided
- HTTP/3 test cases similar to HTTP/2
- multiuse of parallel transfers for HTTP/3, tested for ngtcp2 and quiche
- Fix for data attach/detach in VTLS filters that could lead to crashes
during parallel transfers.
- Eliminating setup() methods in cfilters, no longer needed.
- Improving Curl_conn_is_alive() to replace Curl_connalive() and
integrated ssl alive checks into cfilter.
- Adding CF_CNTRL_CONN_INFO_UPDATE to tell filters to update
connection into and persist it at the easy handle.
- Several more cfilter related cleanups and moves:
- stream_weigth and dependency info is now wrapped in struct
Curl_data_priority
- Curl_data_priority members depend is available in HTTP2|HTTP3
- Curl_data_priority members depend on NGHTTP2 support
- handling init/reset/cleanup of priority part of url.c
- data->state.priority same struct, but shallow copy for compares only
- PROTOPT_STREAM has been removed
- Curl_conn_is_mulitplex() now available to check on capability
- Adding query method to connection filters.
- ngtcp2+quiche: implementing query for max concurrent transfers.
- Adding is_alive and keep_alive cfilter methods. Adding DATA_SETUP event.
- setting keepalive timestamp on connect
- DATA_SETUP is called after the connection has been completely
setup (but may not connected yet) to allow filters to initialize
data members they use.
- there is no socket to be had with msh3, it is unclear how select
shall work
- manual test via "curl --http3 https://curl.se" fail with "empty
reply from server".
- Various socket/conn related cleanups:
- Curl_socket is now Curl_socket_open and in cf-socket.c
- Curl_closesocket is now Curl_socket_close and in cf-socket.c
- Curl_ssl_use has been replaced with Cur_conn_is_ssl
- Curl_conn_tcp_accepted_set has been split into
Curl_conn_tcp_listen_set and Curl_conn_tcp_accepted_set
with a clearer purpose
Closes #10141
This commit is contained in:
parent
1c18f8da51
commit
71b7e01610
48 changed files with 6908 additions and 4675 deletions
93
lib/http.h
93
lib/http.h
|
|
@ -24,6 +24,11 @@
|
|||
*
|
||||
***************************************************************************/
|
||||
#include "curl_setup.h"
|
||||
|
||||
#if defined(USE_MSH3) && !defined(_WIN32)
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
#include "ws.h"
|
||||
|
||||
typedef enum {
|
||||
|
|
@ -37,10 +42,6 @@ typedef enum {
|
|||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
|
||||
#ifdef USE_NGHTTP2
|
||||
#include <nghttp2/nghttp2.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && defined(ENABLE_QUIC)
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
|
@ -179,29 +180,6 @@ CURLcode Curl_http_auth_act(struct Curl_easy *data);
|
|||
struct h3out; /* see ngtcp2 */
|
||||
#endif
|
||||
|
||||
#ifdef USE_MSH3
|
||||
#ifdef _WIN32
|
||||
#define msh3_lock CRITICAL_SECTION
|
||||
#define msh3_lock_initialize(lock) InitializeCriticalSection(lock)
|
||||
#define msh3_lock_uninitialize(lock) DeleteCriticalSection(lock)
|
||||
#define msh3_lock_acquire(lock) EnterCriticalSection(lock)
|
||||
#define msh3_lock_release(lock) LeaveCriticalSection(lock)
|
||||
#else /* !_WIN32 */
|
||||
#include <pthread.h>
|
||||
#define msh3_lock pthread_mutex_t
|
||||
#define msh3_lock_initialize(lock) { \
|
||||
pthread_mutexattr_t attr; \
|
||||
pthread_mutexattr_init(&attr); \
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
|
||||
pthread_mutex_init(lock, &attr); \
|
||||
pthread_mutexattr_destroy(&attr); \
|
||||
}
|
||||
#define msh3_lock_uninitialize(lock) pthread_mutex_destroy(lock)
|
||||
#define msh3_lock_acquire(lock) pthread_mutex_lock(lock)
|
||||
#define msh3_lock_release(lock) pthread_mutex_unlock(lock)
|
||||
#endif /* _WIN32 */
|
||||
#endif /* USE_MSH3 */
|
||||
|
||||
/****************************************************************************
|
||||
* HTTP unique setup
|
||||
***************************************************************************/
|
||||
|
|
@ -278,17 +256,22 @@ struct HTTP {
|
|||
bool firstheader; /* FALSE until headers arrive */
|
||||
bool firstbody; /* FALSE until body arrives */
|
||||
bool h3req; /* FALSE until request is issued */
|
||||
#endif
|
||||
#endif /* !USE_MSH3 */
|
||||
bool upload_done;
|
||||
#endif
|
||||
#endif /* ENABLE_QUIC */
|
||||
#ifdef USE_NGHTTP3
|
||||
size_t unacked_window;
|
||||
struct h3out *h3out; /* per-stream buffers for upload */
|
||||
struct dynbuf overflow; /* excess data received during a single Curl_read */
|
||||
#endif
|
||||
#endif /* USE_NGHTTP3 */
|
||||
#ifdef USE_MSH3
|
||||
struct MSH3_REQUEST *req;
|
||||
msh3_lock recv_lock;
|
||||
#ifdef _WIN32
|
||||
CRITICAL_SECTION recv_lock;
|
||||
#else /* !_WIN32 */
|
||||
pthread_mutex_t recv_lock;
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/* Receive Buffer (Headers and Data) */
|
||||
uint8_t* recv_buf;
|
||||
size_t recv_buf_alloc;
|
||||
|
|
@ -300,53 +283,7 @@ struct HTTP {
|
|||
bool recv_data_complete;
|
||||
/* General Receive Error */
|
||||
CURLcode recv_error;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef USE_NGHTTP2
|
||||
/* h2 settings for this connection */
|
||||
struct h2settings {
|
||||
uint32_t max_concurrent_streams;
|
||||
bool enable_push;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct http_conn {
|
||||
#ifdef USE_NGHTTP2
|
||||
#define H2_BINSETTINGS_LEN 80
|
||||
uint8_t binsettings[H2_BINSETTINGS_LEN];
|
||||
size_t binlen; /* length of the binsettings data */
|
||||
|
||||
/* We associate the connectdata struct with the connection, but we need to
|
||||
make sure we can identify the current "driving" transfer. This is a
|
||||
work-around for the lack of nghttp2_session_set_user_data() in older
|
||||
nghttp2 versions that we want to support. (Added in 1.31.0) */
|
||||
struct Curl_easy *trnsfr;
|
||||
|
||||
nghttp2_session *h2;
|
||||
Curl_send *send_underlying; /* underlying send Curl_send callback */
|
||||
Curl_recv *recv_underlying; /* underlying recv Curl_recv callback */
|
||||
char *inbuf; /* buffer to receive data from underlying socket */
|
||||
size_t inbuflen; /* number of bytes filled in inbuf */
|
||||
size_t nread_inbuf; /* number of bytes read from in inbuf */
|
||||
/* We need separate buffer for transmission and reception because we
|
||||
may call nghttp2_session_send() after the
|
||||
nghttp2_session_mem_recv() but mem buffer is still not full. In
|
||||
this case, we wrongly sends the content of mem buffer if we share
|
||||
them for both cases. */
|
||||
int32_t pause_stream_id; /* stream ID which paused
|
||||
nghttp2_session_mem_recv */
|
||||
size_t drain_total; /* sum of all stream's UrlState.drain */
|
||||
|
||||
/* this is a hash of all individual streams (Curl_easy structs) */
|
||||
struct h2settings settings;
|
||||
|
||||
/* list of settings that will be sent */
|
||||
nghttp2_settings_entry local_settings[3];
|
||||
size_t local_settings_num;
|
||||
#else
|
||||
int unused; /* prevent a compiler warning */
|
||||
#endif
|
||||
#endif /* USE_MSH3 */
|
||||
};
|
||||
|
||||
CURLcode Curl_http_size(struct Curl_easy *data);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue