mirror of
https://github.com/lammertb/libhttp.git
synced 2025-08-06 05:02:40 +03:00
Removed config option structure
This commit is contained in:
@@ -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
|
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
|
names, return value is guaranteed to be non-NULL. If parameter is not
|
||||||
set, zero-length string is returned. */
|
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. */
|
/* 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);
|
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 {
|
struct httplib_server_ports {
|
||||||
int protocol; /* 1 = IPv4, 2 = IPv6, 3 = both */
|
int protocol; /* 1 = IPv4, 2 = IPv6, 3 = both */
|
||||||
int port; /* port number */
|
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 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 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_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 uint64_t httplib_get_random( void );
|
||||||
LIBHTTP_API void * httplib_get_user_connection_data( const struct httplib_connection *conn );
|
LIBHTTP_API void * httplib_get_user_connection_data( const struct httplib_connection *conn );
|
||||||
LIBHTTP_API int httplib_kill( pid_t pid, int sig_num );
|
LIBHTTP_API int httplib_kill( pid_t pid, int sig_num );
|
||||||
|
@@ -27,14 +27,6 @@
|
|||||||
|
|
||||||
#include "httplib_main.h"
|
#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
|
* Check if the XX_httplib_config_options and the corresponding enum have
|
||||||
* compatible sizes
|
* compatible sizes
|
||||||
|
@@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
void XX_httplib_free_context( struct httplib_context *ctx ) {
|
void XX_httplib_free_context( struct httplib_context *ctx ) {
|
||||||
|
|
||||||
int i;
|
|
||||||
struct httplib_handler_info *tmp_rh;
|
struct httplib_handler_info *tmp_rh;
|
||||||
|
|
||||||
if ( ctx == NULL ) return;
|
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->url_rewrite_patterns = httplib_free( ctx->url_rewrite_patterns );
|
||||||
ctx->websocket_root = httplib_free( ctx->websocket_root );
|
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
|
* Deallocate request handlers
|
||||||
*/
|
*/
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016 Lammert Bies
|
* 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
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -24,8 +22,12 @@
|
|||||||
|
|
||||||
#include "httplib_main.h"
|
#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
|
* 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
|
* given context. If an error occurs, NULL is returned. If the option is valid
|
||||||
@@ -33,17 +35,102 @@
|
|||||||
* string.
|
* 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 ( ! httplib_strcasecmp( name, "access_control_allow_origin" ) ) return (ctx == NULL) ? buffer : store_str( buffer, buflen, ctx->access_control_allow_origin );
|
||||||
if ( i == -1 ) return NULL;
|
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 NULL;
|
||||||
|
|
||||||
return ctx->cfg[i];
|
|
||||||
|
|
||||||
} /* httplib_get_option */
|
} /* 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 */
|
||||||
|
@@ -26,18 +26,3 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "httplib_main.h"
|
#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 */
|
|
||||||
|
@@ -26,9 +26,3 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "httplib_main.h"
|
#include "httplib_main.h"
|
||||||
|
|
||||||
const struct httplib_option *httplib_get_valid_options( void ) {
|
|
||||||
|
|
||||||
return XX_httplib_config_options;
|
|
||||||
|
|
||||||
} /* httplib_get_valid_options */
|
|
||||||
|
@@ -389,11 +389,6 @@ union usa {
|
|||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* NOTE(lsm): this enum shoulds be in sync with the config_options below. */
|
|
||||||
enum {
|
|
||||||
NUM_OPTIONS
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* enum CTX_STATUS_...
|
* enum CTX_STATUS_...
|
||||||
*
|
*
|
||||||
@@ -531,7 +526,6 @@ struct httplib_context {
|
|||||||
|
|
||||||
volatile enum ctx_status_t status; /* Should we stop event loop */
|
volatile enum ctx_status_t status; /* Should we stop event loop */
|
||||||
SSL_CTX *ssl_ctx; /* SSL context */
|
SSL_CTX *ssl_ctx; /* SSL context */
|
||||||
char *cfg[NUM_OPTIONS]; /* LibHTTP configuration parameters */
|
|
||||||
struct httplib_callbacks callbacks; /* User-defined callback function */
|
struct httplib_callbacks callbacks; /* User-defined callback function */
|
||||||
void *user_data; /* User-defined data */
|
void *user_data; /* User-defined data */
|
||||||
enum ctx_type_t ctx_type; /* CTX_TYPE_SERVER or CTX_TYPE_CLIENT */
|
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 );
|
void XX_httplib_free_context( struct httplib_context *ctx );
|
||||||
const char * XX_httplib_get_header( const struct httplib_request_info *ri, const char *name );
|
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 );
|
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 );
|
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 );
|
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 );
|
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 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
extern const struct uriprot_tp XX_httplib_abs_uri_protocols[];
|
extern const struct uriprot_tp XX_httplib_abs_uri_protocols[];
|
||||||
extern struct httplib_option XX_httplib_config_options[];
|
|
||||||
|
@@ -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 ) {
|
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;
|
if ( ctx == NULL ) return false;
|
||||||
|
|
||||||
ctx->access_control_allow_origin = NULL;
|
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_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;
|
if ( check_int( ctx, options, "websocket_timeout", & ctx->websocket_timeout, 0, INT_MAX ) ) return true;
|
||||||
|
|
||||||
else {
|
/*
|
||||||
|
* TODO: Currently silently ignoring unrecognized options
|
||||||
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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
return false;
|
||||||
|
|
||||||
} /* process_options */
|
} /* process_options */
|
||||||
|
79
src/main.c
79
src/main.c
@@ -136,6 +136,11 @@ struct tuser_data {
|
|||||||
char *first_message;
|
char *first_message;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct httplib_option {
|
||||||
|
const char * name;
|
||||||
|
const char * value;
|
||||||
|
};
|
||||||
|
|
||||||
static int g_exit_flag = 0; /* Main loop should exit */
|
static int g_exit_flag = 0; /* Main loop should exit */
|
||||||
static char g_server_base_name[40]; /* Set by init_server_name() */
|
static char g_server_base_name[40]; /* Set by init_server_name() */
|
||||||
static const char *g_server_name; /* 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 };
|
enum { OPTION_TITLE, OPTION_ICON, NUM_MAIN_OPTIONS };
|
||||||
|
|
||||||
static struct httplib_option main_config_options[] = {
|
static struct httplib_option main_config_options[] = {
|
||||||
{ "title", 0x02, NULL },
|
{ "title", NULL },
|
||||||
{ "icon", 0x02, NULL },
|
{ "icon", NULL },
|
||||||
{ NULL, CONFIG_TYPE_UNKNOWN, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static void WINCDECL signal_handler(int sig_num) {
|
static void WINCDECL signal_handler(int sig_num) {
|
||||||
|
|
||||||
g_exit_flag = 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 ) {
|
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";
|
if ( exeName == NULL || *exeName == '\0' ) exeName = "libhttp";
|
||||||
|
|
||||||
show_server_name();
|
show_server_name();
|
||||||
@@ -233,16 +234,6 @@ static NO_RETURN void show_usage_and_exit( const char *exeName ) {
|
|||||||
fprintf(stderr, " %s -R <htpasswd_file> <realm> <user>\n", exeName);
|
fprintf(stderr, " %s -R <htpasswd_file> <realm> <user>\n", exeName);
|
||||||
fprintf(stderr, "\nOPTIONS:\n");
|
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) ? "<empty>" : 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) ? "<empty>" : options[i].default_value));
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
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 ) {
|
static int set_option( struct httplib_option_t *options, const char *name, const char *value ) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
int type;
|
|
||||||
const struct httplib_option *default_options = httplib_get_valid_options();
|
|
||||||
|
|
||||||
for (i = 0; main_config_options[i].name != NULL; i++) {
|
for (i = 0; main_config_options[i].name != NULL; i++) {
|
||||||
if (0 == strcmp(name, main_config_options[i].name)) {
|
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++) {
|
for (i = 0; i < MAX_OPTIONS; i++) {
|
||||||
|
|
||||||
if ( options[i].name == NULL ) {
|
if ( options[i].name == NULL ) {
|
||||||
@@ -2072,16 +2023,18 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
#else /* GUI */
|
#else /* GUI */
|
||||||
|
|
||||||
int
|
int main( int argc, char *argv[] ) {
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
char buf1[1024];
|
||||||
init_server_name(argc, (const char **)argv);
|
char buf2[1024];
|
||||||
|
|
||||||
|
init_server_name( argc, (const char **)argv );
|
||||||
start_libhttp(argc, argv);
|
start_libhttp(argc, argv);
|
||||||
fprintf(stdout,
|
fprintf(stdout,
|
||||||
"%s started on port(s) %s with web root [%s]\n",
|
"%s started on port(s) %s with web root [%s]\n",
|
||||||
g_server_name,
|
g_server_name,
|
||||||
httplib_get_option(g_ctx, "listening_ports"),
|
httplib_get_option( g_ctx, "listening_ports", buf1, sizeof(buf1) ),
|
||||||
httplib_get_option(g_ctx, "document_root"));
|
httplib_get_option( g_ctx, "document_root", buf2, sizeof(buf2) ) );
|
||||||
while (g_exit_flag == 0) {
|
while (g_exit_flag == 0) {
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user