mirror of
https://github.com/curl/curl.git
synced 2026-08-25 22:13:33 +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
35
lib/ftp.c
35
lib/ftp.c
|
|
@ -61,6 +61,7 @@
|
|||
#include "strcase.h"
|
||||
#include "vtls/vtls.h"
|
||||
#include "cfilters.h"
|
||||
#include "cf-socket.h"
|
||||
#include "connect.h"
|
||||
#include "strerror.h"
|
||||
#include "inet_ntop.h"
|
||||
|
|
@ -285,8 +286,8 @@ static CURLcode AcceptServerConnect(struct Curl_easy *data)
|
|||
conn->bits.do_more = FALSE;
|
||||
|
||||
(void)curlx_nonblock(s, TRUE); /* enable non-blocking */
|
||||
/* Replace any filter on SECONDARY with one listening on this socket */
|
||||
result = Curl_conn_socket_accepted_set(data, conn, SECONDARYSOCKET, &s);
|
||||
/* Replace any filter on SECONDARY with one listeing on this socket */
|
||||
result = Curl_conn_tcp_accepted_set(data, conn, SECONDARYSOCKET, &s);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
|
|
@ -819,26 +820,11 @@ static int ftp_domore_getsock(struct Curl_easy *data,
|
|||
|
||||
if(FTP_STOP == ftpc->state) {
|
||||
int bits = GETSOCK_READSOCK(0);
|
||||
bool any = FALSE;
|
||||
|
||||
/* if stopped and still in this state, then we're also waiting for a
|
||||
connect on the secondary connection */
|
||||
socks[0] = conn->sock[FIRSTSOCKET];
|
||||
|
||||
if(!data->set.ftp_use_port) {
|
||||
int s;
|
||||
int i;
|
||||
/* PORT is used to tell the server to connect to us, and during that we
|
||||
don't do happy eyeballs, but we do if we connect to the server */
|
||||
for(s = 1, i = 0; i<2; i++) {
|
||||
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
|
||||
socks[s] = conn->tempsock[i];
|
||||
bits |= GETSOCK_WRITESOCK(s++);
|
||||
any = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!any) {
|
||||
if(conn->sock[SECONDARYSOCKET] != CURL_SOCKET_BAD) {
|
||||
socks[1] = conn->sock[SECONDARYSOCKET];
|
||||
bits |= GETSOCK_WRITESOCK(1) | GETSOCK_READSOCK(1);
|
||||
}
|
||||
|
|
@ -1097,7 +1083,7 @@ static CURLcode ftp_state_use_port(struct Curl_easy *data,
|
|||
portsock = CURL_SOCKET_BAD;
|
||||
error = 0;
|
||||
for(ai = res; ai; ai = ai->ai_next) {
|
||||
if(Curl_socket(data, ai, NULL, &portsock)) {
|
||||
if(Curl_socket_open(data, ai, NULL, conn->transport, &portsock)) {
|
||||
error = SOCKERRNO;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1266,9 +1252,8 @@ static CURLcode ftp_state_use_port(struct Curl_easy *data,
|
|||
/* store which command was sent */
|
||||
ftpc->count1 = fcmd;
|
||||
|
||||
/* Replace any filter on SECONDARY with one listening on this socket */
|
||||
result = Curl_conn_socket_accepted_set(data, conn, SECONDARYSOCKET,
|
||||
&portsock);
|
||||
/* Replace any filter on SECONDARY with one listeing on this socket */
|
||||
result = Curl_conn_tcp_listen_set(data, conn, SECONDARYSOCKET, &portsock);
|
||||
if(result)
|
||||
goto out;
|
||||
portsock = CURL_SOCKET_BAD; /* now held in filter */
|
||||
|
|
@ -1279,7 +1264,7 @@ out:
|
|||
state(data, FTP_STOP);
|
||||
}
|
||||
if(portsock != CURL_SOCKET_BAD)
|
||||
Curl_closesocket(data, conn, portsock);
|
||||
Curl_socket_close(data, conn, portsock);
|
||||
free(addr);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1954,7 +1939,7 @@ static CURLcode ftp_state_pasv_resp(struct Curl_easy *data,
|
|||
|
||||
/* postponed address resolution in case of tcp fastopen */
|
||||
if(conn->bits.tcp_fastopen && !conn->bits.reuse && !ftpc->newhost[0]) {
|
||||
Curl_conninfo_remote(data, conn, conn->sock[FIRSTSOCKET]);
|
||||
Curl_conn_ev_update_info(data, conn);
|
||||
Curl_safefree(ftpc->newhost);
|
||||
ftpc->newhost = strdup(control_address(conn));
|
||||
if(!ftpc->newhost)
|
||||
|
|
@ -2742,7 +2727,7 @@ static CURLcode ftp_statemachine(struct Curl_easy *data,
|
|||
if((ftpcode == 234) || (ftpcode == 334)) {
|
||||
/* this was BLOCKING, keep it so for now */
|
||||
bool done;
|
||||
if(!Curl_conn_is_ssl(data, FIRSTSOCKET)) {
|
||||
if(!Curl_conn_is_ssl(conn, FIRSTSOCKET)) {
|
||||
result = Curl_ssl_cfilter_add(data, conn, FIRSTSOCKET);
|
||||
if(result) {
|
||||
/* we failed and bail out */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue