summaryrefslogtreecommitdiff
path: root/lib/cfilters.h
diff options
context:
space:
mode:
authorStefan Eissing <stefan@eissing.org>2022-11-25 14:06:43 +0100
committerDaniel Stenberg <daniel@haxx.se>2022-11-28 13:56:23 +0100
commit55807e6c056f27846d70cec70ee6ac3f0e5b3bbe (patch)
tree85ab09a67ed74d35a1c6689ed539bac116f08341 /lib/cfilters.h
parentdbd74baf781e33e95071a729a81c91a972eff0b7 (diff)
downloadcurl-55807e6c056f27846d70cec70ee6ac3f0e5b3bbe.tar.gz
tls: backends use connection filters for IO, enabling HTTPS-proxy
- OpenSSL (and compatible) - BearSSL - gnutls - mbedtls - rustls - schannel - secure-transport - wolfSSL (v5.0.0 and newer) This leaves only the following without HTTPS-proxy support: - gskit - nss - wolfSSL (versions earlier than v5.0.0) Closes #9962
Diffstat (limited to 'lib/cfilters.h')
-rw-r--r--lib/cfilters.h115
1 files changed, 64 insertions, 51 deletions
diff --git a/lib/cfilters.h b/lib/cfilters.h
index c339e4651..4b81b42e6 100644
--- a/lib/cfilters.h
+++ b/lib/cfilters.h
@@ -33,20 +33,20 @@ struct connectdata;
/* Callback to destroy resources held by this filter instance.
* Implementations MUST NOT chain calls to cf->next.
*/
-typedef void Curl_cf_destroy_this(struct Curl_cfilter *cf,
- struct Curl_easy *data);
+typedef void Curl_cft_destroy_this(struct Curl_cfilter *cf,
+ struct Curl_easy *data);
/* Setup the connection for `data`, using destination `remotehost`.
*/
-typedef CURLcode Curl_cf_setup(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- const struct Curl_dns_entry *remotehost);
-typedef void Curl_cf_close(struct Curl_cfilter *cf,
- struct Curl_easy *data);
+typedef CURLcode Curl_cft_setup(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ const struct Curl_dns_entry *remotehost);
+typedef void Curl_cft_close(struct Curl_cfilter *cf,
+ struct Curl_easy *data);
-typedef CURLcode Curl_cf_connect(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- bool blocking, bool *done);
+typedef CURLcode Curl_cft_connect(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ bool blocking, bool *done);
/* Return the hostname and port the connection goes to.
* This may change with the connection state of filters when tunneling
@@ -59,40 +59,40 @@ typedef CURLcode Curl_cf_connect(struct Curl_cfilter *cf,
* this is owned by the connection.
* @param pport on return, contains the port number
*/
-typedef void Curl_cf_get_host(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- const char **phost,
- const char **pdisplay_host,
- int *pport);
+typedef void Curl_cft_get_host(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ const char **phost,
+ const char **pdisplay_host,
+ int *pport);
/* Filters may return sockets and fdset flags they are waiting for.
* The passes array has room for up to MAX_SOCKSPEREASYHANDLE sockets.
* @return read/write fdset for index in socks
* or GETSOCK_BLANK when nothing to wait on
*/
-typedef int Curl_cf_get_select_socks(struct Curl_cfilter *cf,
- struct Curl_easy *data,
- curl_socket_t *socks);
-
-typedef bool Curl_cf_data_pending(struct Curl_cfilter *cf,
- const struct Curl_easy *data);
-
-typedef ssize_t Curl_cf_send(struct Curl_cfilter *cf,
- struct Curl_easy *data, /* transfer */
- const void *buf, /* data to write */
- size_t len, /* max amount to write */
- CURLcode *err); /* error to return */
-
-typedef ssize_t Curl_cf_recv(struct Curl_cfilter *cf,
- struct Curl_easy *data, /* transfer */
- char *buf, /* store data here */
- size_t len, /* max amount to read */
- CURLcode *err); /* error to return */
-
-typedef void Curl_cf_attach_data(struct Curl_cfilter *cf,
- struct Curl_easy *data);
-typedef void Curl_cf_detach_data(struct Curl_cfilter *cf,
- struct Curl_easy *data);
+typedef int Curl_cft_get_select_socks(struct Curl_cfilter *cf,
+ struct Curl_easy *data,
+ curl_socket_t *socks);
+
+typedef bool Curl_cft_data_pending(struct Curl_cfilter *cf,
+ const struct Curl_easy *data);
+
+typedef ssize_t Curl_cft_send(struct Curl_cfilter *cf,
+ struct Curl_easy *data, /* transfer */
+ const void *buf, /* data to write */
+ size_t len, /* amount to write */
+ CURLcode *err); /* error to return */
+
+typedef ssize_t Curl_cft_recv(struct Curl_cfilter *cf,
+ struct Curl_easy *data, /* transfer */
+ char *buf, /* store data here */
+ size_t len, /* amount to read */
+ CURLcode *err); /* error to return */
+
+typedef void Curl_cft_attach_data(struct Curl_cfilter *cf,
+ struct Curl_easy *data);
+typedef void Curl_cft_detach_data(struct Curl_cfilter *cf,
+ struct Curl_easy *data);
/**
* The easy handle `data` is being detached (no longer served)
@@ -108,19 +108,19 @@ void Curl_conn_detach(struct connectdata *conn, struct Curl_easy *data);
/* A connection filter type, e.g. specific implementation. */
struct Curl_cftype {
- const char *name; /* name of the filter type */
- long flags; /* flags of filter type */
- Curl_cf_destroy_this *destroy; /* destroy resources of this cf */
- Curl_cf_setup *setup; /* setup for a connection */
- Curl_cf_connect *connect; /* establish connection */
- Curl_cf_close *close; /* close conn */
- Curl_cf_get_host *get_host; /* host filter talks to */
- Curl_cf_get_select_socks *get_select_socks;/* sockets to select on */
- Curl_cf_data_pending *has_data_pending;/* conn has data pending */
- Curl_cf_send *do_send; /* send data */
- Curl_cf_recv *do_recv; /* receive data */
- Curl_cf_attach_data *attach_data; /* data is being handled here */
- Curl_cf_detach_data *detach_data; /* data is no longer handled here */
+ const char *name; /* name of the filter type */
+ long flags; /* flags of filter type */
+ Curl_cft_destroy_this *destroy; /* destroy resources of this cf */
+ Curl_cft_setup *setup; /* setup for a connection */
+ Curl_cft_connect *connect; /* establish connection */
+ Curl_cft_close *close; /* close conn */
+ Curl_cft_get_host *get_host; /* host filter talks to */
+ Curl_cft_get_select_socks *get_select_socks;/* sockets to select on */
+ Curl_cft_data_pending *has_data_pending;/* conn has data pending */
+ Curl_cft_send *do_send; /* send data */
+ Curl_cft_recv *do_recv; /* receive data */
+ Curl_cft_attach_data *attach_data; /* data is being handled here */
+ Curl_cft_detach_data *detach_data; /* data is no longer handled here */
};
/* A connection filter instance, e.g. registered at a connection */
@@ -198,6 +198,12 @@ void Curl_conn_cf_discard_all(struct Curl_easy *data,
*/
void Curl_conn_cf_discard(struct Curl_cfilter *cf, struct Curl_easy *data);
+
+ssize_t Curl_conn_cf_send(struct Curl_cfilter *cf, struct Curl_easy *data,
+ const void *buf, size_t len, CURLcode *err);
+ssize_t Curl_conn_cf_recv(struct Curl_cfilter *cf, struct Curl_easy *data,
+ char *buf, size_t len, CURLcode *err);
+
#define CURL_CF_SSL_DEFAULT -1
#define CURL_CF_SSL_DISABLE 0
#define CURL_CF_SSL_ENABLE 1
@@ -238,6 +244,13 @@ bool Curl_conn_is_connected(struct connectdata *conn, int sockindex);
bool Curl_conn_is_ip_connected(struct Curl_easy *data, int sockindex);
/**
+ * Determine if the connection is using SSL to the remote host
+ * (or will be once connected). This will return FALSE, if SSL
+ * is only used in proxying and not for the tunnel itself.
+ */
+bool Curl_conn_is_ssl(struct Curl_easy *data, int sockindex);
+
+/**
* Close the filter chain at `sockindex` for connection `data->conn`.
* Filters remain in place and may be connected again afterwards.
*/