diff --git a/include/libhttp.h b/include/libhttp.h index 9cc750fd..6523f2c9 100644 --- a/include/libhttp.h +++ b/include/libhttp.h @@ -429,7 +429,6 @@ LIBHTTP_API void httplib_set_auth_handler(struct httplib_context *ctx, const cha If given parameter name is not valid, NULL is returned. For valid names, return value is guaranteed to be non-NULL. If parameter is not set, zero-length string is returned. */ -LIBHTTP_API const char *httplib_get_option(const struct httplib_context *ctx, const char *name); /* Get context from connection. */ @@ -441,28 +440,6 @@ httplib_get_context(const struct httplib_connection *conn); LIBHTTP_API void *httplib_get_user_data(const struct httplib_context *ctx); - - - - -struct httplib_option { - const char *name; - int type; - const char *default_value; -}; - - -enum { - CONFIG_TYPE_UNKNOWN = 0x0, -}; - - -/* Return array of struct httplib_option, representing all valid configuration - options of libhttp.c. - The array is terminated by a NULL name option. */ -LIBHTTP_API const struct httplib_option *httplib_get_valid_options(void); - - struct httplib_server_ports { int protocol; /* 1 = IPv4, 2 = IPv6, 3 = both */ int port; /* port number */ @@ -941,6 +918,7 @@ LIBHTTP_API int httplib_closedir( DIR *dir ); LIBHTTP_API void httplib_cry( const struct httplib_context *ctx, const struct httplib_connection *conn, PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(3, 4); LIBHTTP_API char * httplib_error_string( int error_code, char *buf, size_t buf_len ); LIBHTTP_API const char * httplib_get_builtin_mime_type( const char *file_name ); +LIBHTTP_API const char * httplib_get_option( const struct httplib_context *ctx, const char *name, char *buffer, size_t buflen ); LIBHTTP_API uint64_t httplib_get_random( void ); LIBHTTP_API void * httplib_get_user_connection_data( const struct httplib_connection *conn ); LIBHTTP_API int httplib_kill( pid_t pid, int sig_num ); diff --git a/src/httplib_config_options.c b/src/httplib_config_options.c index 9df4f223..2005f94c 100644 --- a/src/httplib_config_options.c +++ b/src/httplib_config_options.c @@ -27,14 +27,6 @@ #include "httplib_main.h" -/* - * Config option name, config types, default value - */ - -struct httplib_option XX_httplib_config_options[] = { - { NULL, CONFIG_TYPE_UNKNOWN, NULL } -}; - /* * Check if the XX_httplib_config_options and the corresponding enum have * compatible sizes diff --git a/src/httplib_free_context.c b/src/httplib_free_context.c index 2a473c91..9a311370 100644 --- a/src/httplib_free_context.c +++ b/src/httplib_free_context.c @@ -39,7 +39,6 @@ void XX_httplib_free_context( struct httplib_context *ctx ) { - int i; struct httplib_handler_info *tmp_rh; if ( ctx == NULL ) return; @@ -105,8 +104,6 @@ void XX_httplib_free_context( struct httplib_context *ctx ) { ctx->url_rewrite_patterns = httplib_free( ctx->url_rewrite_patterns ); ctx->websocket_root = httplib_free( ctx->websocket_root ); - for (i = 0; i < NUM_OPTIONS; i++) ctx->cfg[i] = httplib_free( ctx->cfg[i] ); - /* * Deallocate request handlers */ diff --git a/src/httplib_get_option.c b/src/httplib_get_option.c index 90010d70..c70bef04 100644 --- a/src/httplib_get_option.c +++ b/src/httplib_get_option.c @@ -1,7 +1,5 @@ /* * Copyright (c) 2016 Lammert Bies - * Copyright (c) 2013-2016 the Civetweb developers - * Copyright (c) 2004-2013 Sergey Lyubka * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,8 +22,12 @@ #include "httplib_main.h" +static const char * store_bool( char *buffer, size_t buflen, bool value ); +static const char * store_int( char *buffer, size_t buflen, int value ); +static const char * store_str( char *buffer, size_t buflen, const char *value ); + /* - * const char *httplib_get_option( const struct httplib_context *ctx, const char *name ); + * const char *httplib_get_option( const struct httplib_context *ctx, const char *name, char *buffer, size_t buflen ); * * The function httplib_get_option() returns the content of an option for a * given context. If an error occurs, NULL is returned. If the option is valid @@ -33,17 +35,102 @@ * string. */ -const char *httplib_get_option( const struct httplib_context *ctx, const char *name ) { +const char *httplib_get_option( const struct httplib_context *ctx, const char *name, char *buffer, size_t buflen ) { - int i; + if ( name == NULL || buffer == NULL || buflen < 1 ) return NULL; - if ( name == NULL ) return NULL; + buffer[0] = '\0'; - i = XX_httplib_get_option_index( name ); - if ( i == -1 ) return NULL; + if ( ! httplib_strcasecmp( name, "access_control_allow_origin" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->access_control_allow_origin ); + if ( ! httplib_strcasecmp( name, "access_control_list" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->access_control_list ); + if ( ! httplib_strcasecmp( name, "access_log_file" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->access_log_file ); + if ( ! httplib_strcasecmp( name, "allow_sendfile_call" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->allow_sendfile_call ); + if ( ! httplib_strcasecmp( name, "authentication_domain" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->authentication_domain ); + if ( ! httplib_strcasecmp( name, "cgi_environment" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->cgi_environment ); + if ( ! httplib_strcasecmp( name, "cgi_interpreter" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->cgi_interpreter ); + if ( ! httplib_strcasecmp( name, "cgi_pattern" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->cgi_pattern ); + if ( ! httplib_strcasecmp( name, "decode_url" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->decode_url ); + if ( ! httplib_strcasecmp( name, "document_root" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->document_root ); + if ( ! httplib_strcasecmp( name, "enable_directory_listing" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->enable_directory_listing ); + if ( ! httplib_strcasecmp( name, "enable_keep_alive" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->enable_keep_alive ); + if ( ! httplib_strcasecmp( name, "error_log_file" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->error_log_file ); + if ( ! httplib_strcasecmp( name, "error_pages" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->error_pages ); + if ( ! httplib_strcasecmp( name, "extra_mime_types" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->extra_mime_types ); + if ( ! httplib_strcasecmp( name, "global_auth_file" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->global_auth_file ); + if ( ! httplib_strcasecmp( name, "hide_file_pattern" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->hide_file_pattern ); + if ( ! httplib_strcasecmp( name, "index_files" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->index_files ); + if ( ! httplib_strcasecmp( name, "listening_ports" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->listening_ports ); + if ( ! httplib_strcasecmp( name, "num_threads" ) ) return (ctx == NULL) ? buffer : store_int( buffer, buflen, ctx->num_threads ); + if ( ! httplib_strcasecmp( name, "protect_uri" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->protect_uri ); + if ( ! httplib_strcasecmp( name, "put_delete_auth_file" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->put_delete_auth_file ); + if ( ! httplib_strcasecmp( name, "request_timeout" ) ) return (ctx == NULL) ? buffer : store_int( buffer, buflen, ctx->request_timeout ); + if ( ! httplib_strcasecmp( name, "run_as_user" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->run_as_user ); + if ( ! httplib_strcasecmp( name, "ssi_pattern" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->ssi_pattern ); + if ( ! httplib_strcasecmp( name, "ssl_ca_file" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->ssl_ca_file ); + if ( ! httplib_strcasecmp( name, "ssl_ca_path" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->ssl_ca_path ); + if ( ! httplib_strcasecmp( name, "ssl_certificate" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->ssl_certificate ); + if ( ! httplib_strcasecmp( name, "ssl_cipher_list" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->ssl_cipher_list ); + if ( ! httplib_strcasecmp( name, "ssl_protocol_version" ) ) return (ctx == NULL) ? buffer : store_int( buffer, buflen, ctx->ssl_protocol_version ); + if ( ! httplib_strcasecmp( name, "ssl_short_trust" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->ssl_short_trust ); + if ( ! httplib_strcasecmp( name, "ssl_verify_depth" ) ) return (ctx == NULL) ? buffer : store_int( buffer, buflen, ctx->ssl_verify_depth ); + if ( ! httplib_strcasecmp( name, "ssl_verify_paths" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->ssl_verify_paths ); + if ( ! httplib_strcasecmp( name, "ssl_verify_peer" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->ssl_verify_peer ); + if ( ! httplib_strcasecmp( name, "static_file_max_age" ) ) return (ctx == NULL) ? buffer : store_int( buffer, buflen, ctx->static_file_max_age ); + if ( ! httplib_strcasecmp( name, "throttle" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->throttle ); + if ( ! httplib_strcasecmp( name, "tcp_nodelay" ) ) return (ctx == NULL) ? buffer : store_bool( buffer, buflen, ctx->tcp_nodelay ); + if ( ! httplib_strcasecmp( name, "url_rewrite_patterns" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->url_rewrite_patterns ); + if ( ! httplib_strcasecmp( name, "websocket_root" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->websocket_root ); + if ( ! httplib_strcasecmp( name, "websocket_timeout" ) ) return (ctx == NULL) ? buffer : store_int( buffer, buflen, ctx->websocket_timeout ); - if ( ctx == NULL || ctx->cfg[i] == NULL ) return ""; - - return ctx->cfg[i]; + return NULL; } /* httplib_get_option */ + +/* + * static const char *store_str( char *buffer, size_t buflen, const char *value ); + * + * The function store_str() returns a pointer to a filled string containing the + * value of a configuration option. If an error occurs or the option is NULL, + * the function returns NULL. + */ + +static const char *store_str( char *buffer, size_t buflen, const char *value ) { + + if ( value == NULL ) return NULL; + if ( buflen < strlen(value)+1 ) return NULL; + + httplib_strlcpy( buffer, value, buflen ); + return buffer; + +} /* store_str */ + +/* + * static const char *store_bool( char *buffer, size_t buflen, bool value ); + * + * The function store_bool() returns a pointer to a filled string containing + * the value of a boolean configuration option. If an error occurs the function + * returns NULL. + */ + +static const char *store_bool( char *buffer, size_t buflen, bool value ) { + + return store_str( buffer, buflen, (value) ? "yes" : "no" ); + +} /* store_bool */ + +/* + * static const char *store_int( char *buffer, size_t buflen, int value ); + * + * The function store_int() returns a pointer to a filled string containing the + * value of an integer configuration option. If an error occurs the function + * returns NULL. + */ + +static const char *store_int( char *buffer, size_t buflen, int value ) { + + char storage[32]; + + snprintf( storage, 32, "%d", value ); + return store_str( buffer, buflen, storage ); + +} /* store_int */ diff --git a/src/httplib_get_option_index.c b/src/httplib_get_option_index.c index 19019a53..71a5ac7c 100644 --- a/src/httplib_get_option_index.c +++ b/src/httplib_get_option_index.c @@ -26,18 +26,3 @@ */ #include "httplib_main.h" - -int XX_httplib_get_option_index( const char *name ) { - - int i; - - if ( name == NULL ) return -1; - - for (i=0; XX_httplib_config_options[i].name != NULL; i++) { - - if ( strcmp( XX_httplib_config_options[i].name, name ) == 0 ) return i; - } - - return -1; - -} /* XX_httplib_get_option_index */ diff --git a/src/httplib_get_valid_options.c b/src/httplib_get_valid_options.c index aff41154..71a5ac7c 100644 --- a/src/httplib_get_valid_options.c +++ b/src/httplib_get_valid_options.c @@ -26,9 +26,3 @@ */ #include "httplib_main.h" - -const struct httplib_option *httplib_get_valid_options( void ) { - - return XX_httplib_config_options; - -} /* httplib_get_valid_options */ diff --git a/src/httplib_main.h b/src/httplib_main.h index 965e36b3..29323cd1 100644 --- a/src/httplib_main.h +++ b/src/httplib_main.h @@ -389,11 +389,6 @@ union usa { struct sockaddr_in6 sin6; }; -/* NOTE(lsm): this enum shoulds be in sync with the config_options below. */ -enum { - NUM_OPTIONS -}; - /* * enum CTX_STATUS_... * @@ -531,7 +526,6 @@ struct httplib_context { volatile enum ctx_status_t status; /* Should we stop event loop */ SSL_CTX *ssl_ctx; /* SSL context */ - char *cfg[NUM_OPTIONS]; /* LibHTTP configuration parameters */ struct httplib_callbacks callbacks; /* User-defined callback function */ void *user_data; /* User-defined data */ enum ctx_type_t ctx_type; /* CTX_TYPE_SERVER or CTX_TYPE_CLIENT */ @@ -815,7 +809,6 @@ bool XX_httplib_forward_body_data( struct httplib_connection *conn, FILE *fp, void XX_httplib_free_context( struct httplib_context *ctx ); const char * XX_httplib_get_header( const struct httplib_request_info *ri, const char *name ); void XX_httplib_get_mime_type( struct httplib_context *ctx, const char *path, struct vec *vec ); -int XX_httplib_get_option_index( const char *name ); const char * XX_httplib_get_rel_url_at_current_server( const char *uri, const struct httplib_connection *conn ); uint32_t XX_httplib_get_remote_ip( const struct httplib_connection *conn ); int XX_httplib_get_request_handler( struct httplib_connection *conn, int handler_type, httplib_request_handler *handler, httplib_websocket_connect_handler *connect_handler, httplib_websocket_ready_handler *ready_handler, httplib_websocket_data_handler *data_handler, httplib_websocket_close_handler *close_handler, httplib_authorization_handler *auth_handler, void **cbdata ); @@ -934,4 +927,3 @@ extern pthread_mutexattr_t XX_httplib_pthread_mutex_attr; #endif /* _WIN32 */ extern const struct uriprot_tp XX_httplib_abs_uri_protocols[]; -extern struct httplib_option XX_httplib_config_options[]; diff --git a/src/httplib_start.c b/src/httplib_start.c index 35e79751..589925cb 100644 --- a/src/httplib_start.c +++ b/src/httplib_start.c @@ -280,10 +280,6 @@ struct httplib_context *httplib_start( const struct httplib_callbacks *callbacks static bool process_options( struct httplib_context *ctx, const struct httplib_option_t *options ) { - int i; - int idx; - const char *default_value; - if ( ctx == NULL ) return false; ctx->access_control_allow_origin = NULL; @@ -406,35 +402,13 @@ static bool process_options( struct httplib_context *ctx, const struct httplib_o if ( check_dir( ctx, options, "websocket_root", & ctx->websocket_root ) ) return true; if ( check_int( ctx, options, "websocket_timeout", & ctx->websocket_timeout, 0, INT_MAX ) ) return true; - else { - - idx = XX_httplib_get_option_index( options->name ); - - if ( idx == -1 ) { cleanup( ctx, "Invalid option: %s", options->name ); return true; } - if ( options->value == NULL ) { cleanup( ctx, "%s: option value cannot be NULL", options->name ); return true; } - - if ( ctx->cfg[idx] != NULL ) { - - httplib_cry( ctx, NULL, "warning: %s: duplicate option", options->name ); - ctx->cfg[idx] = httplib_free( ctx->cfg[idx] ); - } - - ctx->cfg[idx] = httplib_strdup( options->value ); - } + /* + * TODO: Currently silently ignoring unrecognized options + */ options++; } - /* - * Set default value if needed - */ - - for (i=0; XX_httplib_config_options[i].name != NULL; i++) { - - default_value = XX_httplib_config_options[i].default_value; - if ( ctx->cfg[i] == NULL && default_value != NULL ) ctx->cfg[i] = httplib_strdup( default_value ); - } - return false; } /* process_options */ diff --git a/src/main.c b/src/main.c index 2a1afcb4..f3a97587 100644 --- a/src/main.c +++ b/src/main.c @@ -136,6 +136,11 @@ struct tuser_data { char *first_message; }; +struct httplib_option { + const char * name; + const char * value; +}; + static int g_exit_flag = 0; /* Main loop should exit */ static char g_server_base_name[40]; /* Set by init_server_name() */ static const char *g_server_name; /* Set by init_server_name() */ @@ -162,12 +167,11 @@ static struct tuser_data enum { OPTION_TITLE, OPTION_ICON, NUM_MAIN_OPTIONS }; static struct httplib_option main_config_options[] = { - { "title", 0x02, NULL }, - { "icon", 0x02, NULL }, - { NULL, CONFIG_TYPE_UNKNOWN, NULL } + { "title", NULL }, + { "icon", NULL }, + { NULL, NULL } }; - static void WINCDECL signal_handler(int sig_num) { g_exit_flag = sig_num; @@ -212,9 +216,6 @@ show_server_name(void) static NO_RETURN void show_usage_and_exit( const char *exeName ) { - const struct httplib_option *options; - int i; - if ( exeName == NULL || *exeName == '\0' ) exeName = "libhttp"; show_server_name(); @@ -233,16 +234,6 @@ static NO_RETURN void show_usage_and_exit( const char *exeName ) { fprintf(stderr, " %s -R \n", exeName); fprintf(stderr, "\nOPTIONS:\n"); - options = httplib_get_valid_options(); - for (i = 0; options[i].name != NULL; i++) { - fprintf(stderr, " -%s %s\n", options[i].name, ((options[i].default_value == NULL) ? "" : options[i].default_value)); - } - - options = main_config_options; - for (i = 0; options[i].name != NULL; i++) { - fprintf(stderr, " -%s %s\n", options[i].name, ((options[i].default_value == NULL) ? "" : options[i].default_value)); - } - exit(EXIT_FAILURE); } @@ -335,8 +326,6 @@ static const char * get_option( struct httplib_option_t *options, const char *op static int set_option( struct httplib_option_t *options, const char *name, const char *value ) { int i; - int type; - const struct httplib_option *default_options = httplib_get_valid_options(); for (i = 0; main_config_options[i].name != NULL; i++) { if (0 == strcmp(name, main_config_options[i].name)) { @@ -346,44 +335,6 @@ static int set_option( struct httplib_option_t *options, const char *name, const } } - type = CONFIG_TYPE_UNKNOWN; - for (i = 0; default_options[i].name != NULL; i++) { - if (!strcmp( default_options[i].name, name ) ) type = default_options[i].type; - } - - switch (type) { - case CONFIG_TYPE_UNKNOWN: - /* unknown option */ - return 0; - case 0x1 : /* CONFIG_TYPE_NUMBER: */ - /* integer number > 0, e.g. number of threads */ - if (atol(value) < 0) { - /* invalid number */ - return 0; - } - break; - case 0x02 : /* CONFIG_TYPE_STRING: */ - /* any text */ - break; - case 0x5 : /* CONFIG_TYPE_BOOLEAN: */ - /* boolean value, yes or no */ - if ((0 != strcmp(value, "yes")) && (0 != strcmp(value, "no"))) { - /* invalid boolean */ - return 0; - } - break; - case 0x03 : /* CONFIG_TYPE_FILE: */ - case 0x04 : /* CONFIG_TYPE_DIRECTORY: */ - /* TODO (low): check this option when it is set, instead of calling - * verify_existence later */ - break; - case 0x06 : /* CONFIG_TYPE_EXT_PATTERN: */ - /* list of file extentions */ - break; - default: - die("Unknown option type - option %s", name); - } - for (i = 0; i < MAX_OPTIONS; i++) { if ( options[i].name == NULL ) { @@ -2072,16 +2023,18 @@ main(int argc, char *argv[]) #else /* GUI */ -int -main(int argc, char *argv[]) -{ - init_server_name(argc, (const char **)argv); +int main( int argc, char *argv[] ) { + + char buf1[1024]; + char buf2[1024]; + + init_server_name( argc, (const char **)argv ); start_libhttp(argc, argv); fprintf(stdout, "%s started on port(s) %s with web root [%s]\n", g_server_name, - httplib_get_option(g_ctx, "listening_ports"), - httplib_get_option(g_ctx, "document_root")); + httplib_get_option( g_ctx, "listening_ports", buf1, sizeof(buf1) ), + httplib_get_option( g_ctx, "document_root", buf2, sizeof(buf2) ) ); while (g_exit_flag == 0) { sleep(1); }