#ifndef CLIENT_H
#define CLIENT_H
#include <stdbool.h>
#include "rustls.h"
#include "common.h"
typedef struct demo_client_options
{
bool use_no_verifier;
bool use_platform_verifier;
const char *use_ca_certificate_verifier;
const char *use_auth_cert_file;
const char *use_auth_cert_key_file;
bool use_ech_grease;
const char *use_ech_config_list_files;
const char *use_ssl_keylog_file;
bool use_stderr_keylog;
const char *custom_ciphersuite_name;
bool use_vectored_io;
} demo_client_options;
int options_from_env(demo_client_options *opts);
const rustls_client_config *new_tls_config(const demo_client_options *opts);
typedef struct demo_client_request_options
{
const rustls_client_config *tls_config;
const char *hostname;
const char *port;
const char *path;
bool use_vectored_io;
} demo_client_request_options;
int do_get_request(const demo_client_request_options *options);
typedef struct demo_client_connection
{
const demo_client_request_options *options;
int sockfd;
rustls_connection *rconn;
conndata *data;
bool closing;
bool clean_closure;
} demo_client_connection;
void demo_client_connection_free(demo_client_connection *conn);
demo_client_connection *demo_client_connect(
const demo_client_request_options *options);
#define MAX_CONNECT_ATTEMPTS 10
int connect_socket(const demo_client_request_options *options);
int demo_client_connection_write_get(const demo_client_connection *demo_conn);
demo_result demo_client_connection_read_tls(demo_client_connection *demo_conn);
demo_result demo_client_connection_write_tls(
const demo_client_connection *demo_conn);
uint32_t unsafe_skip_verify(void *userdata,
const rustls_verify_server_cert_params *params);
#endif