2022-11-11 18:45:34 +08:00
|
|
|
#ifndef HEADER_CURL_VTLS_INT_H
|
|
|
|
#define HEADER_CURL_VTLS_INT_H
|
|
|
|
/***************************************************************************
|
|
|
|
* _ _ ____ _
|
|
|
|
* Project ___| | | | _ \| |
|
|
|
|
* / __| | | | |_) | |
|
|
|
|
* | (__| |_| | _ <| |___
|
|
|
|
* \___|\___/|_| \_\_____|
|
|
|
|
*
|
2023-01-02 20:51:48 +08:00
|
|
|
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
2022-11-11 18:45:34 +08:00
|
|
|
*
|
|
|
|
* This software is licensed as described in the file COPYING, which
|
|
|
|
* you should have received as part of this distribution. The terms
|
|
|
|
* are also available at https://curl.se/docs/copyright.html.
|
|
|
|
*
|
|
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: curl
|
|
|
|
*
|
|
|
|
***************************************************************************/
|
|
|
|
#include "curl_setup.h"
|
2022-11-22 16:55:41 +08:00
|
|
|
#include "cfilters.h"
|
2022-11-11 18:45:34 +08:00
|
|
|
#include "urldata.h"
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
#ifdef USE_SSL
|
|
|
|
|
2023-04-06 15:54:57 +08:00
|
|
|
/* see https://www.iana.org/assignments/tls-extensiontype-values/ */
|
|
|
|
#define ALPN_HTTP_1_1_LENGTH 8
|
|
|
|
#define ALPN_HTTP_1_1 "http/1.1"
|
|
|
|
#define ALPN_H2_LENGTH 2
|
|
|
|
#define ALPN_H2 "h2"
|
|
|
|
#define ALPN_H3_LENGTH 2
|
|
|
|
#define ALPN_H3 "h3"
|
|
|
|
|
|
|
|
/* conservative sizes on the ALPN entries and count we are handling,
|
|
|
|
* we can increase these if we ever feel the need or have to accommodate
|
|
|
|
* ALPN strings from the "outside". */
|
|
|
|
#define ALPN_NAME_MAX 10
|
|
|
|
#define ALPN_ENTRIES_MAX 3
|
|
|
|
#define ALPN_PROTO_BUF_MAX (ALPN_ENTRIES_MAX * (ALPN_NAME_MAX + 1))
|
|
|
|
|
|
|
|
struct alpn_spec {
|
|
|
|
const char entries[ALPN_ENTRIES_MAX][ALPN_NAME_MAX];
|
|
|
|
size_t count; /* number of entries */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct alpn_proto_buf {
|
|
|
|
unsigned char data[ALPN_PROTO_BUF_MAX];
|
|
|
|
int len;
|
|
|
|
};
|
|
|
|
|
|
|
|
CURLcode Curl_alpn_to_proto_buf(struct alpn_proto_buf *buf,
|
|
|
|
const struct alpn_spec *spec);
|
|
|
|
CURLcode Curl_alpn_to_proto_str(struct alpn_proto_buf *buf,
|
|
|
|
const struct alpn_spec *spec);
|
|
|
|
|
|
|
|
CURLcode Curl_alpn_set_negotiated(struct Curl_cfilter *cf,
|
|
|
|
struct Curl_easy *data,
|
|
|
|
const unsigned char *proto,
|
|
|
|
size_t proto_len);
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
/* Information in each SSL cfilter context: cf->ctx */
|
|
|
|
struct ssl_connect_data {
|
|
|
|
ssl_connection_state state;
|
|
|
|
ssl_connect_state connecting_state;
|
2023-11-17 22:26:08 +08:00
|
|
|
struct ssl_peer peer;
|
connections: introduce http/3 happy eyeballs
New cfilter HTTP-CONNECT for h3/h2/http1.1 eyeballing.
- filter is installed when `--http3` in the tool is used (or
the equivalent CURLOPT_ done in the library)
- starts a QUIC/HTTP/3 connect right away. Should that not
succeed after 100ms (subject to change), a parallel attempt
is started for HTTP/2 and HTTP/1.1 via TCP
- both attempts are subject to IPv6/IPv4 eyeballing, same
as happens for other connections
- tie timeout to the ip-version HAPPY_EYEBALLS_TIMEOUT
- use a `soft` timeout at half the value. When the soft timeout
expires, the HTTPS-CONNECT filter checks if the QUIC filter
has received any data from the server. If not, it will start
the HTTP/2 attempt.
HTTP/3(ngtcp2) improvements.
- setting call_data in all cfilter calls similar to http/2 and vtls filters
for use in callback where no stream data is available.
- returning CURLE_PARTIAL_FILE for prematurely terminated transfers
- enabling pytest test_05 for h3
- shifting functionality to "connect" UDP sockets from ngtcp2
implementation into the udp socket cfilter. Because unconnected
UDP sockets are weird. For example they error when adding to a
pollset.
HTTP/3(quiche) improvements.
- fixed upload bug in quiche implementation, now passes 251 and pytest
- error codes on stream RESET
- improved debug logs
- handling of DRAIN during connect
- limiting pending event queue
HTTP/2 cfilter improvements.
- use LOG_CF macros for dynamic logging in debug build
- fix CURLcode on RST streams to be CURLE_PARTIAL_FILE
- enable pytest test_05 for h2
- fix upload pytests and improve parallel transfer performance.
GOAWAY handling for ngtcp2/quiche
- during connect, when the remote server refuses to accept new connections
and closes immediately (so the local conn goes into DRAIN phase), the
connection is torn down and a another attempt is made after a short grace
period.
This is the behaviour observed with nghttpx when we tell it to shut
down gracefully. Tested in pytest test_03_02.
TLS improvements
- ALPN selection for SSL/SSL-PROXY filters in one vtls set of functions, replaces
copy of logic in all tls backends.
- standardized the infof logging of offered ALPNs
- ALPN negotiated: have common function for all backends that sets alpn proprty
and connection related things based on the negotiated protocol (or lack thereof).
- new tests/tests-httpd/scorecard.py for testing h3/h2 protocol implementation.
Invoke:
python3 tests/tests-httpd/scorecard.py --help
for usage.
Improvements on gathering connect statistics and socket access.
- new CF_CTRL_CONN_REPORT_STATS cfilter control for having cfilters
report connection statistics. This is triggered when the connection
has completely connected.
- new void Curl_pgrsTimeWas(..) method to report a timer update with
a timestamp of when it happend. This allows for updating timers
"later", e.g. a connect statistic after full connectivity has been
reached.
- in case of HTTP eyeballing, the previous changes will update
statistics only from the filter chain that "won" the eyeballing.
- new cfilter query CF_QUERY_SOCKET for retrieving the socket used
by a filter chain.
Added methods Curl_conn_cf_get_socket() and Curl_conn_get_socket()
for convenient use of this query.
- Change VTLS backend to query their sub-filters for the socket when
checks during the handshake are made.
HTTP/3 documentation on how https eyeballing works.
TLS improvements
- ALPN selection for SSL/SSL-PROXY filters in one vtls set of functions, replaces
copy of logic in all tls backends.
- standardized the infof logging of offered ALPNs
- ALPN negotiated: have common function for all backends that sets alpn proprty
and connection related things based on the negotiated protocol (or lack thereof).
Scorecard with Caddy.
- configure can be run with `--with-test-caddy=path` to specify which caddy to use for testing
- tests/tests-httpd/scorecard.py now measures download speeds with caddy
pytest improvements
- adding Makfile to clean gen dir
- adding nghttpx rundir creation on start
- checking httpd version 2.4.55 for test_05 cases where it is needed. Skipping with message if too old.
- catch exception when checking for caddy existance on system.
Closes #10349
2023-02-02 00:13:12 +08:00
|
|
|
const struct alpn_spec *alpn; /* ALPN to use or NULL for none */
|
2023-05-09 18:10:40 +08:00
|
|
|
void *backend; /* vtls backend specific props */
|
2023-01-23 18:41:23 +08:00
|
|
|
struct cf_call_data call_data; /* data handle used in current call */
|
connections: introduce http/3 happy eyeballs
New cfilter HTTP-CONNECT for h3/h2/http1.1 eyeballing.
- filter is installed when `--http3` in the tool is used (or
the equivalent CURLOPT_ done in the library)
- starts a QUIC/HTTP/3 connect right away. Should that not
succeed after 100ms (subject to change), a parallel attempt
is started for HTTP/2 and HTTP/1.1 via TCP
- both attempts are subject to IPv6/IPv4 eyeballing, same
as happens for other connections
- tie timeout to the ip-version HAPPY_EYEBALLS_TIMEOUT
- use a `soft` timeout at half the value. When the soft timeout
expires, the HTTPS-CONNECT filter checks if the QUIC filter
has received any data from the server. If not, it will start
the HTTP/2 attempt.
HTTP/3(ngtcp2) improvements.
- setting call_data in all cfilter calls similar to http/2 and vtls filters
for use in callback where no stream data is available.
- returning CURLE_PARTIAL_FILE for prematurely terminated transfers
- enabling pytest test_05 for h3
- shifting functionality to "connect" UDP sockets from ngtcp2
implementation into the udp socket cfilter. Because unconnected
UDP sockets are weird. For example they error when adding to a
pollset.
HTTP/3(quiche) improvements.
- fixed upload bug in quiche implementation, now passes 251 and pytest
- error codes on stream RESET
- improved debug logs
- handling of DRAIN during connect
- limiting pending event queue
HTTP/2 cfilter improvements.
- use LOG_CF macros for dynamic logging in debug build
- fix CURLcode on RST streams to be CURLE_PARTIAL_FILE
- enable pytest test_05 for h2
- fix upload pytests and improve parallel transfer performance.
GOAWAY handling for ngtcp2/quiche
- during connect, when the remote server refuses to accept new connections
and closes immediately (so the local conn goes into DRAIN phase), the
connection is torn down and a another attempt is made after a short grace
period.
This is the behaviour observed with nghttpx when we tell it to shut
down gracefully. Tested in pytest test_03_02.
TLS improvements
- ALPN selection for SSL/SSL-PROXY filters in one vtls set of functions, replaces
copy of logic in all tls backends.
- standardized the infof logging of offered ALPNs
- ALPN negotiated: have common function for all backends that sets alpn proprty
and connection related things based on the negotiated protocol (or lack thereof).
- new tests/tests-httpd/scorecard.py for testing h3/h2 protocol implementation.
Invoke:
python3 tests/tests-httpd/scorecard.py --help
for usage.
Improvements on gathering connect statistics and socket access.
- new CF_CTRL_CONN_REPORT_STATS cfilter control for having cfilters
report connection statistics. This is triggered when the connection
has completely connected.
- new void Curl_pgrsTimeWas(..) method to report a timer update with
a timestamp of when it happend. This allows for updating timers
"later", e.g. a connect statistic after full connectivity has been
reached.
- in case of HTTP eyeballing, the previous changes will update
statistics only from the filter chain that "won" the eyeballing.
- new cfilter query CF_QUERY_SOCKET for retrieving the socket used
by a filter chain.
Added methods Curl_conn_cf_get_socket() and Curl_conn_get_socket()
for convenient use of this query.
- Change VTLS backend to query their sub-filters for the socket when
checks during the handshake are made.
HTTP/3 documentation on how https eyeballing works.
TLS improvements
- ALPN selection for SSL/SSL-PROXY filters in one vtls set of functions, replaces
copy of logic in all tls backends.
- standardized the infof logging of offered ALPNs
- ALPN negotiated: have common function for all backends that sets alpn proprty
and connection related things based on the negotiated protocol (or lack thereof).
Scorecard with Caddy.
- configure can be run with `--with-test-caddy=path` to specify which caddy to use for testing
- tests/tests-httpd/scorecard.py now measures download speeds with caddy
pytest improvements
- adding Makfile to clean gen dir
- adding nghttpx rundir creation on start
- checking httpd version 2.4.55 for test_05 cases where it is needed. Skipping with message if too old.
- catch exception when checking for caddy existance on system.
Closes #10349
2023-02-02 00:13:12 +08:00
|
|
|
struct curltime handshake_done; /* time when handshake finished */
|
2023-04-06 15:54:57 +08:00
|
|
|
BIT(use_alpn); /* if ALPN shall be used in handshake */
|
2024-03-08 16:37:27 +08:00
|
|
|
BIT(peer_closed); /* peer has closed connection */
|
2022-11-22 16:55:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2023-05-09 18:10:40 +08:00
|
|
|
#undef CF_CTX_CALL_DATA
|
2023-01-23 18:41:23 +08:00
|
|
|
#define CF_CTX_CALL_DATA(cf) \
|
|
|
|
((struct ssl_connect_data *)(cf)->ctx)->call_data
|
|
|
|
|
|
|
|
|
2022-11-11 18:45:34 +08:00
|
|
|
/* Definitions for SSL Implementations */
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
struct Curl_ssl {
|
2022-11-11 18:45:34 +08:00
|
|
|
/*
|
|
|
|
* This *must* be the first entry to allow returning the list of available
|
|
|
|
* backends in curl_global_sslset().
|
|
|
|
*/
|
|
|
|
curl_ssl_backend info;
|
|
|
|
unsigned int supports; /* bitfield, see above */
|
|
|
|
size_t sizeof_ssl_backend_data;
|
|
|
|
|
|
|
|
int (*init)(void);
|
|
|
|
void (*cleanup)(void);
|
|
|
|
|
|
|
|
size_t (*version)(char *buffer, size_t size);
|
2022-11-22 16:55:41 +08:00
|
|
|
int (*check_cxn)(struct Curl_cfilter *cf, struct Curl_easy *data);
|
|
|
|
int (*shut_down)(struct Curl_cfilter *cf,
|
|
|
|
struct Curl_easy *data);
|
|
|
|
bool (*data_pending)(struct Curl_cfilter *cf,
|
|
|
|
const struct Curl_easy *data);
|
2022-11-11 18:45:34 +08:00
|
|
|
|
|
|
|
/* return 0 if a find random is filled in */
|
|
|
|
CURLcode (*random)(struct Curl_easy *data, unsigned char *entropy,
|
|
|
|
size_t length);
|
|
|
|
bool (*cert_status_request)(void);
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
CURLcode (*connect_blocking)(struct Curl_cfilter *cf,
|
|
|
|
struct Curl_easy *data);
|
|
|
|
CURLcode (*connect_nonblocking)(struct Curl_cfilter *cf,
|
|
|
|
struct Curl_easy *data,
|
2022-11-11 18:45:34 +08:00
|
|
|
bool *done);
|
|
|
|
|
lib: introduce struct easy_poll_set for poll information
Connection filter had a `get_select_socks()` method, inspired by the
various `getsocks` functions involved during the lifetime of a
transfer. These, depending on transfer state (CONNECT/DO/DONE/ etc.),
return sockets to monitor and flag if this shall be done for POLLIN
and/or POLLOUT.
Due to this design, sockets and flags could only be added, not
removed. This led to problems in filters like HTTP/2 where flow control
prohibits the sending of data until the peer increases the flow
window. The general transfer loop wants to write, adds POLLOUT, the
socket is writeable but no data can be written.
This leads to cpu busy loops. To prevent that, HTTP/2 did set the
`SEND_HOLD` flag of such a blocked transfer, so the transfer loop cedes
further attempts. This works if only one such filter is involved. If a
HTTP/2 transfer goes through a HTTP/2 proxy, two filters are
setting/clearing this flag and may step on each other's toes.
Connection filters `get_select_socks()` is replaced by
`adjust_pollset()`. They get passed a `struct easy_pollset` that keeps
up to `MAX_SOCKSPEREASYHANDLE` sockets and their `POLLIN|POLLOUT`
flags. This struct is initialized in `multi_getsock()` by calling the
various `getsocks()` implementations based on transfer state, as before.
After protocol handlers/transfer loop have set the sockets and flags
they want, the `easy_pollset` is *always* passed to the filters. Filters
"higher" in the chain are called first, starting at the first
not-yet-connection one. Each filter may add sockets and/or change
flags. When all flags are removed, the socket itself is removed from the
pollset.
Example:
* transfer wants to send, adds POLLOUT
* http/2 filter has a flow control block, removes POLLOUT and adds
POLLIN (it is waiting on a WINDOW_UPDATE from the server)
* TLS filter is connected and changes nothing
* h2-proxy filter also has a flow control block on its tunnel stream,
removes POLLOUT and adds POLLIN also.
* socket filter is connected and changes nothing
* The resulting pollset is then mixed together with all other transfers
and their pollsets, just as before.
Use of `SEND_HOLD` is no longer necessary in the filters.
All filters are adapted for the changed method. The handling in
`multi.c` has been adjusted, but its state handling the the protocol
handlers' `getsocks` method are untouched.
The most affected filters are http/2, ngtcp2, quiche and h2-proxy. TLS
filters needed to be adjusted for the connecting handshake read/write
handling.
No noticeable difference in performance was detected in local scorecard
runs.
Closes #11833
2023-09-04 18:06:07 +08:00
|
|
|
/* During handshake, adjust the pollset to include the socket
|
|
|
|
* for POLLOUT or POLLIN as needed.
|
|
|
|
* Mandatory. */
|
|
|
|
void (*adjust_pollset)(struct Curl_cfilter *cf, struct Curl_easy *data,
|
|
|
|
struct easy_pollset *ps);
|
2022-11-11 18:45:34 +08:00
|
|
|
void *(*get_internals)(struct ssl_connect_data *connssl, CURLINFO info);
|
2022-11-22 16:55:41 +08:00
|
|
|
void (*close)(struct Curl_cfilter *cf, struct Curl_easy *data);
|
2022-11-11 18:45:34 +08:00
|
|
|
void (*close_all)(struct Curl_easy *data);
|
|
|
|
|
|
|
|
CURLcode (*set_engine)(struct Curl_easy *data, const char *engine);
|
|
|
|
CURLcode (*set_engine_default)(struct Curl_easy *data);
|
|
|
|
struct curl_slist *(*engines_list)(struct Curl_easy *data);
|
|
|
|
|
|
|
|
bool (*false_start)(void);
|
|
|
|
CURLcode (*sha256sum)(const unsigned char *input, size_t inputlen,
|
|
|
|
unsigned char *sha256sum, size_t sha256sumlen);
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
bool (*attach_data)(struct Curl_cfilter *cf, struct Curl_easy *data);
|
|
|
|
void (*detach_data)(struct Curl_cfilter *cf, struct Curl_easy *data);
|
2022-11-11 18:45:34 +08:00
|
|
|
|
|
|
|
void (*free_multi_ssl_backend_data)(struct multi_ssl_backend_data *mbackend);
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
ssize_t (*recv_plain)(struct Curl_cfilter *cf, struct Curl_easy *data,
|
|
|
|
char *buf, size_t len, CURLcode *code);
|
|
|
|
ssize_t (*send_plain)(struct Curl_cfilter *cf, struct Curl_easy *data,
|
2022-11-11 18:45:34 +08:00
|
|
|
const void *mem, size_t len, CURLcode *code);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
extern const struct Curl_ssl *Curl_ssl;
|
|
|
|
|
|
|
|
|
|
|
|
int Curl_none_init(void);
|
|
|
|
void Curl_none_cleanup(void);
|
2022-11-22 16:55:41 +08:00
|
|
|
int Curl_none_shutdown(struct Curl_cfilter *cf, struct Curl_easy *data);
|
|
|
|
int Curl_none_check_cxn(struct Curl_cfilter *cf, struct Curl_easy *data);
|
2022-11-11 18:45:34 +08:00
|
|
|
CURLcode Curl_none_random(struct Curl_easy *data, unsigned char *entropy,
|
|
|
|
size_t length);
|
|
|
|
void Curl_none_close_all(struct Curl_easy *data);
|
|
|
|
void Curl_none_session_free(void *ptr);
|
2022-11-22 16:55:41 +08:00
|
|
|
bool Curl_none_data_pending(struct Curl_cfilter *cf,
|
|
|
|
const struct Curl_easy *data);
|
2022-11-11 18:45:34 +08:00
|
|
|
bool Curl_none_cert_status_request(void);
|
|
|
|
CURLcode Curl_none_set_engine(struct Curl_easy *data, const char *engine);
|
|
|
|
CURLcode Curl_none_set_engine_default(struct Curl_easy *data);
|
|
|
|
struct curl_slist *Curl_none_engines_list(struct Curl_easy *data);
|
|
|
|
bool Curl_none_false_start(void);
|
lib: introduce struct easy_poll_set for poll information
Connection filter had a `get_select_socks()` method, inspired by the
various `getsocks` functions involved during the lifetime of a
transfer. These, depending on transfer state (CONNECT/DO/DONE/ etc.),
return sockets to monitor and flag if this shall be done for POLLIN
and/or POLLOUT.
Due to this design, sockets and flags could only be added, not
removed. This led to problems in filters like HTTP/2 where flow control
prohibits the sending of data until the peer increases the flow
window. The general transfer loop wants to write, adds POLLOUT, the
socket is writeable but no data can be written.
This leads to cpu busy loops. To prevent that, HTTP/2 did set the
`SEND_HOLD` flag of such a blocked transfer, so the transfer loop cedes
further attempts. This works if only one such filter is involved. If a
HTTP/2 transfer goes through a HTTP/2 proxy, two filters are
setting/clearing this flag and may step on each other's toes.
Connection filters `get_select_socks()` is replaced by
`adjust_pollset()`. They get passed a `struct easy_pollset` that keeps
up to `MAX_SOCKSPEREASYHANDLE` sockets and their `POLLIN|POLLOUT`
flags. This struct is initialized in `multi_getsock()` by calling the
various `getsocks()` implementations based on transfer state, as before.
After protocol handlers/transfer loop have set the sockets and flags
they want, the `easy_pollset` is *always* passed to the filters. Filters
"higher" in the chain are called first, starting at the first
not-yet-connection one. Each filter may add sockets and/or change
flags. When all flags are removed, the socket itself is removed from the
pollset.
Example:
* transfer wants to send, adds POLLOUT
* http/2 filter has a flow control block, removes POLLOUT and adds
POLLIN (it is waiting on a WINDOW_UPDATE from the server)
* TLS filter is connected and changes nothing
* h2-proxy filter also has a flow control block on its tunnel stream,
removes POLLOUT and adds POLLIN also.
* socket filter is connected and changes nothing
* The resulting pollset is then mixed together with all other transfers
and their pollsets, just as before.
Use of `SEND_HOLD` is no longer necessary in the filters.
All filters are adapted for the changed method. The handling in
`multi.c` has been adjusted, but its state handling the the protocol
handlers' `getsocks` method are untouched.
The most affected filters are http/2, ngtcp2, quiche and h2-proxy. TLS
filters needed to be adjusted for the connecting handshake read/write
handling.
No noticeable difference in performance was detected in local scorecard
runs.
Closes #11833
2023-09-04 18:06:07 +08:00
|
|
|
void Curl_ssl_adjust_pollset(struct Curl_cfilter *cf, struct Curl_easy *data,
|
|
|
|
struct easy_pollset *ps);
|
2022-11-22 16:55:41 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the SSL filter below the given one or NULL if there is none.
|
|
|
|
*/
|
|
|
|
bool Curl_ssl_cf_is_proxy(struct Curl_cfilter *cf);
|
|
|
|
|
|
|
|
/* extract a session ID
|
|
|
|
* Sessionid mutex must be locked (see Curl_ssl_sessionid_lock).
|
|
|
|
* Caller must make sure that the ownership of returned sessionid object
|
|
|
|
* is properly taken (e.g. its refcount is incremented
|
|
|
|
* under sessionid mutex).
|
|
|
|
*/
|
|
|
|
bool Curl_ssl_getsessionid(struct Curl_cfilter *cf,
|
|
|
|
struct Curl_easy *data,
|
2024-03-22 20:07:25 +08:00
|
|
|
const struct ssl_peer *peer,
|
2022-11-22 16:55:41 +08:00
|
|
|
void **ssl_sessionid,
|
|
|
|
size_t *idsize); /* set 0 if unknown */
|
|
|
|
/* add a new session ID
|
|
|
|
* Sessionid mutex must be locked (see Curl_ssl_sessionid_lock).
|
|
|
|
* Caller must ensure that it has properly shared ownership of this sessionid
|
|
|
|
* object with cache (e.g. incrementing refcount on success)
|
2024-04-26 16:11:51 +08:00
|
|
|
* Call takes ownership of `ssl_sessionid`, using `sessionid_free_cb`
|
|
|
|
* to destroy it in case of failure or later removal.
|
2022-11-22 16:55:41 +08:00
|
|
|
*/
|
|
|
|
CURLcode Curl_ssl_addsessionid(struct Curl_cfilter *cf,
|
|
|
|
struct Curl_easy *data,
|
2024-03-22 20:07:25 +08:00
|
|
|
const struct ssl_peer *peer,
|
2022-11-22 16:55:41 +08:00
|
|
|
void *ssl_sessionid,
|
|
|
|
size_t idsize,
|
2024-04-26 16:11:51 +08:00
|
|
|
Curl_ssl_sessionid_dtor *sessionid_free_cb);
|
2022-11-11 18:45:34 +08:00
|
|
|
|
|
|
|
#include "openssl.h" /* OpenSSL versions */
|
|
|
|
#include "gtls.h" /* GnuTLS versions */
|
|
|
|
#include "wolfssl.h" /* wolfSSL versions */
|
|
|
|
#include "schannel.h" /* Schannel SSPI version */
|
|
|
|
#include "sectransp.h" /* SecureTransport (Darwin) version */
|
|
|
|
#include "mbedtls.h" /* mbedTLS versions */
|
|
|
|
#include "bearssl.h" /* BearSSL versions */
|
|
|
|
#include "rustls.h" /* rustls versions */
|
|
|
|
|
2022-11-22 16:55:41 +08:00
|
|
|
#endif /* USE_SSL */
|
|
|
|
|
2022-11-11 18:45:34 +08:00
|
|
|
#endif /* HEADER_CURL_VTLS_INT_H */
|