mini/mini_client.h (144 lines of code) (raw):

#ifndef XQC_MINI_CLIENT_H #define XQC_MINI_CLIENT_H #include <ctype.h> #include <stdio.h> #include <errno.h> #include <memory.h> #include <stdlib.h> #include <string.h> #include <event2/event.h> #include <xquic/xquic.h> #include <xquic/xqc_http3.h> #include <xquic/xquic_typedef.h> #ifdef XQC_SYS_WINDOWS #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"event.lib") #pragma comment(lib, "Iphlpapi.lib") #pragma comment(lib, "Bcrypt.lib") #include "../tests/getopt.h" #else #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <unistd.h> #include <netdb.h> #endif #include "../tests/platform.h" #include "common.h" #include "mini_client_cb.h" #define DEFAULT_IP "127.0.0.1" #define DEFAULT_PORT 8443 #define DEFAULT_HOST "test.xquic.com" #define SESSION_TICKET_BUF_MAX_SIZE 8192 #define TRANSPORT_PARAMS_MAX_SIZE 8192 #define TOKEN_MAX_SIZE 8192 #define MAX_PATH_CNT 2 #define XQC_PACKET_BUF_LEN 1500 #define SESSION_TICKET_FILE "session_ticket" #define TRANSPORT_PARAMS_FILE "transport_params" #define TOKEN_FILE "token" #define LOG_PATH "clog.log" #define KEY_PATH "ckeys.log" #define OUT_DIR "." /** * net config definition * net config is those arguments about socket information * all configuration on net should be put under this section */ typedef struct xqc_mini_cli_net_config_s { int conn_timeout; xqc_usec_t last_socket_time; // /* server addr info */ // struct sockaddr *addr; // socklen_t addr_len; // char server_addr[64]; // short server_port; } xqc_mini_cli_net_config_t; /** * quic config definition * quic config is those arguments required by quic features, including connection settings, ssl configs, etc. * all configuration on quic should be put under this section */ typedef struct xqc_mini_cli_quic_config_s { /* cipher config */ char ciphers[CIPHER_SUIT_LEN]; char groups[TLS_GROUPS_LEN]; /* connection ssl config */ char session_ticket[SESSION_TICKET_BUF_MAX_SIZE]; int session_ticket_len; char transport_parameter[TRANSPORT_PARAMS_MAX_SIZE]; int transport_parameter_len; char token[TOKEN_MAX_SIZE]; int token_len; int no_encryption; /* multipath */ int multipath; // mp option, 0: disable, 1: enable char mp_sched[32]; // mp scheduler, minrtt/backup /* congestion control */ CC_TYPE cc; // cc algrithm, bbr/cubic } xqc_mini_cli_quic_config_t; /** * the environment config definition * environment config is those arguments about IO inputs and outputs * all configuration on environment should be put under this section */ typedef struct xqc_mini_cli_env_config_s { /* log config */ char log_path[PATH_LEN]; /* tls certificates */ char private_key_file[PATH_LEN]; char cert_file[PATH_LEN]; /* key export */ char key_out_path[PATH_LEN]; /* output file */ char out_file_dir[PATH_LEN]; } xqc_mini_cli_env_config_t; /** * the request config definition * request config is those arguments about request information * all configuration on request should be put under this section */ typedef struct xqc_mini_cli_req_config_s { char path[RESOURCE_LEN]; /* request path */ char scheme[8]; /* request scheme, http/https */ REQUEST_METHOD method; char host[256]; /* request host */ // char auth[AUTHORITY_LEN]; char url[URL_LEN]; /* original url */ } xqc_mini_cli_req_config_t; typedef struct xqc_mini_cli_args_s { /* network args */ xqc_mini_cli_net_config_t net_cfg; /* xquic args */ xqc_mini_cli_quic_config_t quic_cfg; /* environment args */ xqc_mini_cli_env_config_t env_cfg; /* request args */ xqc_mini_cli_req_config_t req_cfg; } xqc_mini_cli_args_t; typedef struct xqc_mini_cli_ctx_s { struct event_base *eb; xqc_mini_cli_args_t *args; // server arguments for current context xqc_engine_t *engine; // xquic engine for current context struct event *ev_engine; int log_fd; int keylog_fd; } xqc_mini_cli_ctx_t; typedef struct xqc_mini_cli_user_conn_s { xqc_cid_t cid; xqc_h3_conn_t *h3_conn; xqc_mini_cli_ctx_t *ctx; /* ipv4 server */ int fd; int get_local_addr; struct sockaddr *local_addr; socklen_t local_addrlen; struct sockaddr *peer_addr; socklen_t peer_addrlen; struct event *ev_socket; struct event *ev_timeout; } xqc_mini_cli_user_conn_t; typedef struct xqc_mini_cli_user_stream_s { xqc_mini_cli_user_conn_t *user_conn; /* save file */ // char file_name[RESOURCE_LEN]; // FILE *recv_body_fp; /* stat for IO */ size_t send_body_len; size_t recv_body_len; int recv_fin; xqc_msec_t start_time; /* h3 request content */ xqc_h3_request_t *h3_request; xqc_http_headers_t h3_hdrs; uint8_t hdr_sent; char *send_body_buff; int send_body_size; size_t send_offset; } xqc_mini_cli_user_stream_t; void xqc_mini_cli_init_engine_ssl_config(xqc_engine_ssl_config_t *ssl_cfg, xqc_mini_cli_args_t *args); void xqc_mini_cli_init_callback(xqc_engine_callback_t *cb, xqc_transport_callbacks_t *tcb, xqc_mini_cli_args_t *args); int xqc_mini_cli_init_xquic_engine(xqc_mini_cli_ctx_t *ctx, xqc_mini_cli_args_t *args); void xqc_mini_cli_convert_text_to_sockaddr(int type, const char *addr_text, unsigned int port, struct sockaddr **saddr, socklen_t *saddr_len); void xqc_mini_cli_init_args(xqc_mini_cli_args_t *args); int xqc_mini_cli_init_ctx(xqc_mini_cli_ctx_t *ctx, xqc_mini_cli_args_t *args); int xqc_mini_cli_init_env(xqc_mini_cli_ctx_t *ctx, xqc_mini_cli_args_t *args); xqc_scheduler_callback_t xqc_mini_cli_get_sched_cb(xqc_mini_cli_args_t *args); xqc_cong_ctrl_callback_t xqc_mini_cli_get_cc_cb(xqc_mini_cli_args_t *args); void xqc_mini_cli_init_conn_settings(xqc_conn_settings_t *settings, xqc_mini_cli_args_t *args); int xqc_mini_cli_init_alpn_ctx(xqc_mini_cli_ctx_t *ctx); int xqc_mini_cli_init_engine_ctx(xqc_mini_cli_ctx_t *ctx); void xqc_mini_cli_free_ctx(xqc_mini_cli_ctx_t *ctx); void xqc_mini_cli_init_0rtt(xqc_mini_cli_args_t *args); void xqc_mini_cli_init_conn_ssl_config(xqc_conn_ssl_config_t *conn_ssl_config, xqc_mini_cli_args_t *args); int xqc_mini_cli_format_h3_req(xqc_http_header_t *headers, xqc_mini_cli_req_config_t* req_cfg); int xqc_mini_cli_request_send(xqc_h3_request_t *h3_request, xqc_mini_cli_user_stream_t *user_stream); int xqc_mini_cli_send_h3_req(xqc_mini_cli_user_conn_t *user_conn, xqc_mini_cli_user_stream_t *user_stream); int xqc_mini_cli_init_socket(xqc_mini_cli_user_conn_t *user_conn); void xqc_mini_cli_socket_write_handler(xqc_mini_cli_user_conn_t *user_conn, int fd); void xqc_mini_cli_socket_read_handler(xqc_mini_cli_user_conn_t *user_conn, int fd); static void xqc_mini_cli_socket_event_callback(int fd, short what, void *arg); int xqc_mini_cli_init_xquic_connection(xqc_mini_cli_user_conn_t *user_conn); int xqc_mini_cli_main_process(xqc_mini_cli_user_conn_t *user_conn, xqc_mini_cli_ctx_t *ctx); xqc_mini_cli_user_conn_t *xqc_mini_cli_user_conn_create(xqc_mini_cli_ctx_t *ctx); void xqc_mini_cli_free_user_conn(xqc_mini_cli_user_conn_t *user_conn); void xqc_mini_cli_on_connection_finish(xqc_mini_cli_user_conn_t *user_conn); #endif