From: Jeff Trawick Date: Tue, 5 Sep 2006 13:08:15 +0000 (+0000) Subject: Replace ap_get_server_version with ap_get_server_banner() and X-Git-Tag: 2.3.0~2137 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=743a621e8d97c218c829cb603a3fbde265406ed8;p=thirdparty%2Fapache%2Fhttpd.git Replace ap_get_server_version with ap_get_server_banner() and ap_get_server_description(). High-level summary: The full server version information is now included in the error log at startup as well as server status reports, irrespective of the setting of the ServerTokens directive. Third-party modules must now use ap_get_server_banner() or ap_get_server_description() in place of ap_get_server_version(). git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@440337 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 31cde9f998a..00344445935 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,12 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) The full server version information is now included in the error log at + startup as well as server status reports, irrespective of the setting + of the ServerTokens directive. Third-party modules must now use + ap_get_server_banner() or ap_get_server_description() in place of + ap_get_server_version(). [Jeff Trawick] + *) mod_proxy_balancer: Extract stickysession routing information contained as parameter in the URL correctly. PR 40400. [Ruediger Pluem, Tomokazu Harada ] diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 3da5f01abe9..3127c4b2fb4 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -121,14 +121,16 @@ * proxy_server (minor) * 20060110.3 (2.3.0-dev) added inreslist member to proxy_conn_rec (minor) * 20060110.4 (2.3.0-dev) Added server_scheme member to server_rec (minor) + * 20060905.0 (2.3.0-dev) Replaced ap_get_server_version() with + * ap_get_server_banner() and ap_get_server_description() */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ #ifndef MODULE_MAGIC_NUMBER_MAJOR -#define MODULE_MAGIC_NUMBER_MAJOR 20060110 +#define MODULE_MAGIC_NUMBER_MAJOR 20060905 #endif -#define MODULE_MAGIC_NUMBER_MINOR 4 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/httpd.h b/include/httpd.h index 3d367bbb5ae..2fce9ebba88 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -420,13 +420,24 @@ typedef struct { AP_DECLARE(void) ap_get_server_revision(ap_version_t *version); /** - * Get the server version string - * @return The server version string + * Get the server banner in a form suitable for sending over the + * network, with the level of information controlled by the + * ServerTokens directive. + * @return The server banner */ -AP_DECLARE(const char *) ap_get_server_version(void); +AP_DECLARE(const char *) ap_get_server_banner(void); /** - * Add a component to the version string + * Get the server description in a form suitable for local displays, + * status reports, or logging. This includes the detailed server + * version and information about some modules. It is not affected + * by the ServerTokens directive. + * @return The server description + */ +AP_DECLARE(const char *) ap_get_server_description(void); + +/** + * Add a component to the server description and banner strings * @param pconf The pool to allocate the component from * @param component The string to add */ diff --git a/modules/arch/netware/mod_nw_ssl.c b/modules/arch/netware/mod_nw_ssl.c index 535fbf1889c..e294763a415 100644 --- a/modules/arch/netware/mod_nw_ssl.c +++ b/modules/arch/netware/mod_nw_ssl.c @@ -1074,7 +1074,7 @@ char *ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, /* XXX-Can't get specific SSL info from NetWare */ /*result = ssl_var_lookup_ssl_version(p, var+12);*/ else if (strcEQ(var, "SERVER_SOFTWARE")) - result = ap_get_server_version(); + result = ap_get_server_banner(); else if (strcEQ(var, "API_VERSION")) { result = apr_itoa(p, MODULE_MAGIC_NUMBER); resdup = FALSE; diff --git a/modules/experimental/mod_example.c b/modules/experimental/mod_example.c index f26ddf8867c..f296d99f447 100644 --- a/modules/experimental/mod_example.c +++ b/modules/experimental/mod_example.c @@ -546,7 +546,7 @@ static int x_handler(request_rec *r) ap_rputs(" \n", r); ap_rputs("

\n", r); ap_rprintf(r, " Apache HTTP Server version: \"%s\"\n", - ap_get_server_version()); + ap_get_server_banner()); ap_rputs("
\n", r); ap_rprintf(r, " Server built: \"%s\"\n", ap_get_server_built()); ap_rputs("

\n", r);; diff --git a/modules/generators/mod_info.c b/modules/generators/mod_info.c index a999080b0cb..59adf79cd6e 100644 --- a/modules/generators/mod_info.c +++ b/modules/generators/mod_info.c @@ -347,7 +347,7 @@ static int show_server_settings(request_rec * r) ap_rprintf(r, "
Server Version: " "%s
\n", - ap_get_server_version()); + ap_get_server_description()); ap_rprintf(r, "
Server Built: " "%s
\n", diff --git a/modules/generators/mod_status.c b/modules/generators/mod_status.c index fa4386ee777..7fb0f332f7a 100644 --- a/modules/generators/mod_status.c +++ b/modules/generators/mod_status.c @@ -397,7 +397,7 @@ static int status_handler(request_rec *r) ap_rputs("

Apache Server Status for ", r); ap_rvputs(r, ap_get_server_name(r), "

\n\n", NULL); ap_rvputs(r, "
Server Version: ", - ap_get_server_version(), "
\n", NULL); + ap_get_server_description(), "\n", NULL); ap_rvputs(r, "
Server Built: ", ap_get_server_built(), "\n

\n", NULL); ap_rvputs(r, "
Current Time: ", diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c index 33874c1591b..b2407132895 100644 --- a/modules/http/http_filters.c +++ b/modules/http/http_filters.c @@ -735,11 +735,11 @@ static void basic_http_header(request_rec *r, apr_bucket_brigade *bb, if (server) { form_header_field(&h, "Server", server); } else { - form_header_field(&h, "Server", ap_get_server_version()); + form_header_field(&h, "Server", ap_get_server_banner()); } } else { - form_header_field(&h, "Server", ap_get_server_version()); + form_header_field(&h, "Server", ap_get_server_banner()); } /* unset so we don't send them again */ diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index ca700cce332..fceafd606cc 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -2006,7 +2006,7 @@ static char *lookup_variable(char *var, rewrite_ctx *ctx) case 'S': if (!strcmp(var, "SERVER_SOFTWARE")) { - result = ap_get_server_version(); + result = ap_get_server_banner(); } break; } diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index 55d4aa2897a..95725653368 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -667,7 +667,7 @@ static int balancer_handler(request_rec *r) ap_rputs("

Load Balancer Manager for ", r); ap_rvputs(r, ap_get_server_name(r), "

\n\n", NULL); ap_rvputs(r, "
Server Version: ", - ap_get_server_version(), "
\n", NULL); + ap_get_server_description(), "
\n", NULL); ap_rvputs(r, "
Server Built: ", ap_get_server_built(), "\n
\n", NULL); balancer = (proxy_balancer *)conf->balancers->elts; diff --git a/modules/proxy/mod_proxy_connect.c b/modules/proxy/mod_proxy_connect.c index d0519dde7c8..eb9b7de77a5 100644 --- a/modules/proxy/mod_proxy_connect.c +++ b/modules/proxy/mod_proxy_connect.c @@ -224,7 +224,7 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker, "CONNECT %s HTTP/1.0" CRLF, r->uri); apr_socket_send(sock, buffer, &nbytes); nbytes = apr_snprintf(buffer, sizeof(buffer), - "Proxy-agent: %s" CRLF CRLF, ap_get_server_version()); + "Proxy-agent: %s" CRLF CRLF, ap_get_server_banner()); apr_socket_send(sock, buffer, &nbytes); } else { @@ -235,7 +235,7 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker, ap_xlate_proto_to_ascii(buffer, nbytes); apr_socket_send(client_socket, buffer, &nbytes); nbytes = apr_snprintf(buffer, sizeof(buffer), - "Proxy-agent: %s" CRLF CRLF, ap_get_server_version()); + "Proxy-agent: %s" CRLF CRLF, ap_get_server_banner()); ap_xlate_proto_to_ascii(buffer, nbytes); apr_socket_send(client_socket, buffer, &nbytes); #if 0 @@ -244,7 +244,7 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker, */ r->status = HTTP_OK; r->header_only = 1; - apr_table_set(r->headers_out, "Proxy-agent: %s", ap_get_server_version()); + apr_table_set(r->headers_out, "Proxy-agent: %s", ap_get_server_banner()); ap_rflush(r); #endif } diff --git a/modules/proxy/mod_proxy_ftp.c b/modules/proxy/mod_proxy_ftp.c index f0b6118b8c4..be670c0f993 100644 --- a/modules/proxy/mod_proxy_ftp.c +++ b/modules/proxy/mod_proxy_ftp.c @@ -1662,7 +1662,7 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, apr_rfc822_date(dates, r->request_time); apr_table_setn(r->headers_out, "Date", dates); - apr_table_setn(r->headers_out, "Server", ap_get_server_version()); + apr_table_setn(r->headers_out, "Server", ap_get_server_banner()); /* set content-type */ if (dirlisting) { diff --git a/modules/ssl/ssl_engine_vars.c b/modules/ssl/ssl_engine_vars.c index b54a5ccb62a..9617f6d6b2f 100644 --- a/modules/ssl/ssl_engine_vars.c +++ b/modules/ssl/ssl_engine_vars.c @@ -192,7 +192,7 @@ char *ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, if (strlen(var) > 12 && strcEQn(var, "SSL_VERSION_", 12)) result = ssl_var_lookup_ssl_version(p, var+12); else if (strcEQ(var, "SERVER_SOFTWARE")) - result = ap_get_server_version(); + result = ap_get_server_banner(); else if (strcEQ(var, "API_VERSION")) { result = apr_itoa(p, MODULE_MAGIC_NUMBER); resdup = FALSE; diff --git a/server/core.c b/server/core.c index 077964d9408..24e14a42485 100644 --- a/server/core.c +++ b/server/core.c @@ -2580,7 +2580,7 @@ AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r) if (conf->server_signature == srv_sig_withmail) { return apr_pstrcat(r->pool, prefix, "
", - ap_get_server_version(), + ap_get_server_banner(), " Server at server->server_admin) ? "" : "mailto:", ap_escape_html(r->pool, r->server->server_admin), @@ -2590,7 +2590,7 @@ AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r) "
\n", NULL); } - return apr_pstrcat(r->pool, prefix, "
", ap_get_server_version(), + return apr_pstrcat(r->pool, prefix, "
", ap_get_server_banner(), " Server at ", ap_escape_html(r->pool, ap_get_server_name(r)), " Port ", sport, @@ -2605,8 +2605,9 @@ AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r) * string. */ -static char *server_version = NULL; -static int version_locked = 0; +static char *server_banner = NULL; +static int banner_locked = 0; +static char *server_description = NULL; enum server_token_type { SrvTk_MAJOR, /* eg: Apache/2 */ @@ -2618,11 +2619,12 @@ enum server_token_type { }; static enum server_token_type ap_server_tokens = SrvTk_FULL; -static apr_status_t reset_version(void *dummy) +static apr_status_t reset_banner(void *dummy) { - version_locked = 0; + banner_locked = 0; ap_server_tokens = SrvTk_FULL; - server_version = NULL; + server_banner = NULL; + server_description = NULL; return APR_SUCCESS; } @@ -2634,40 +2636,48 @@ AP_DECLARE(void) ap_get_server_revision(ap_version_t *version) version->add_string = AP_SERVER_ADD_STRING; } -AP_DECLARE(const char *) ap_get_server_version(void) +AP_DECLARE(const char *) ap_get_server_description(void) { - return (server_version ? server_version : AP_SERVER_BASEVERSION); + return server_description ? server_description : + AP_SERVER_BASEVERSION " (" PLATFORM ")"; +} + +AP_DECLARE(const char *) ap_get_server_banner(void) +{ + return server_banner ? server_banner : AP_SERVER_BASEVERSION; } AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component) { - if (! version_locked) { + if (! banner_locked) { /* * If the version string is null, register our cleanup to reset the * pointer on pool destruction. We also know that, if NULL, * we are adding the original SERVER_BASEVERSION string. */ - if (server_version == NULL) { - apr_pool_cleanup_register(pconf, NULL, reset_version, + if (server_banner == NULL) { + apr_pool_cleanup_register(pconf, NULL, reset_banner, apr_pool_cleanup_null); - server_version = apr_pstrdup(pconf, component); + server_banner = apr_pstrdup(pconf, component); } else { /* * Tack the given component identifier to the end of * the existing string. */ - server_version = apr_pstrcat(pconf, server_version, " ", - component, NULL); + server_banner = apr_pstrcat(pconf, server_banner, " ", + component, NULL); } } + server_description = apr_pstrcat(pconf, server_description, " ", + component, NULL); } /* - * This routine adds the real server base identity to the version string, + * This routine adds the real server base identity to the banner string, * and then locks out changes until the next reconfig. */ -static void ap_set_version(apr_pool_t *pconf) +static void set_banner(apr_pool_t *pconf) { if (ap_server_tokens == SrvTk_PRODUCT_ONLY) { ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT); @@ -2686,12 +2696,13 @@ static void ap_set_version(apr_pool_t *pconf) } /* - * Lock the server_version string if we're not displaying + * Lock the server_banner string if we're not displaying * the full set of tokens */ if (ap_server_tokens != SrvTk_FULL) { - version_locked++; + banner_locked++; } + server_description = AP_SERVER_BASEVERSION " (" PLATFORM ")"; } static const char *set_serv_tokens(cmd_parms *cmd, void *dummy, @@ -3635,7 +3646,7 @@ static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pte authn_ap_auth_type = APR_RETRIEVE_OPTIONAL_FN(authn_ap_auth_type); authn_ap_auth_name = APR_RETRIEVE_OPTIONAL_FN(authn_ap_auth_name); - ap_set_version(pconf); + set_banner(pconf); ap_setup_make_content_type(pconf); return OK; } diff --git a/server/main.c b/server/main.c index c968bf9cf98..7285eae1a0e 100644 --- a/server/main.c +++ b/server/main.c @@ -92,7 +92,7 @@ static void show_mpm_settings(void) static void show_compile_settings(void) { - printf("Server version: %s\n", ap_get_server_version()); + printf("Server version: %s\n", ap_get_server_description()); printf("Server built: %s\n", ap_get_server_built()); printf("Server's Module Magic Number: %u:%u\n", MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR); @@ -569,7 +569,7 @@ int main(int argc, const char * const argv[]) break; case 'v': - printf("Server version: %s\n", ap_get_server_version()); + printf("Server version: %s\n", ap_get_server_description()); printf("Server built: %s\n", ap_get_server_built()); destroy_and_exit_process(process, 0); diff --git a/server/mpm/beos/beos.c b/server/mpm/beos/beos.c index 0a46d8793e9..30ed26d96c9 100644 --- a/server/mpm/beos/beos.c +++ b/server/mpm/beos/beos.c @@ -935,7 +935,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) */ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); diff --git a/server/mpm/experimental/event/event.c b/server/mpm/experimental/event/event.c index ea21b5660e2..8fbf4074360 100644 --- a/server/mpm/experimental/event/event.c +++ b/server/mpm/experimental/event/event.c @@ -1988,7 +1988,7 @@ int ap_mpm_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); diff --git a/server/mpm/experimental/leader/leader.c b/server/mpm/experimental/leader/leader.c index 473a44e8c32..69ad1b8243e 100644 --- a/server/mpm/experimental/leader/leader.c +++ b/server/mpm/experimental/leader/leader.c @@ -1529,7 +1529,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); #ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH diff --git a/server/mpm/experimental/perchild/perchild.c b/server/mpm/experimental/perchild/perchild.c index 88ff46c0a96..668f909d706 100644 --- a/server/mpm/experimental/perchild/perchild.c +++ b/server/mpm/experimental/perchild/perchild.c @@ -1314,7 +1314,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); #ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH diff --git a/server/mpm/experimental/threadpool/threadpool.c b/server/mpm/experimental/threadpool/threadpool.c index 2442b3d3c7c..0ab89197f0d 100644 --- a/server/mpm/experimental/threadpool/threadpool.c +++ b/server/mpm/experimental/threadpool/threadpool.c @@ -1778,7 +1778,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); #ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH diff --git a/server/mpm/mpmt_os2/mpmt_os2.c b/server/mpm/mpmt_os2/mpmt_os2.c index 99a75c7f767..a5636cefda0 100644 --- a/server/mpm/mpmt_os2/mpmt_os2.c +++ b/server/mpm/mpmt_os2/mpmt_os2.c @@ -207,7 +207,7 @@ static char master_main() int listener_num, num_listeners, slot; ULONG rc; - printf("%s \n", ap_get_server_version()); + printf("%s \n", ap_get_server_description()); set_signals(); if (ap_setup_listeners(ap_server_conf) < 1) { @@ -270,7 +270,7 @@ static char master_main() ap_scoreboard_image->global->restart_time = apr_time_now(); ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); #ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH diff --git a/server/mpm/netware/mpm_netware.c b/server/mpm/netware/mpm_netware.c index f116d2b0005..54d79604524 100644 --- a/server/mpm/netware/mpm_netware.c +++ b/server/mpm/netware/mpm_netware.c @@ -723,7 +723,7 @@ static void display_settings () request_count = 0; ClearScreen (getscreenhandle()); - printf("%s \n", ap_get_server_version()); + printf("%s \n", ap_get_server_description()); for (i=0;i 4) diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index 93ac863c48d..6121a12c287 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -1737,7 +1737,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, "%s configured -- resuming normal operations", - ap_get_server_version()); + ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, "Server built: %s", ap_get_server_built()); #ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH diff --git a/server/mpm_common.c b/server/mpm_common.c index ba60155d880..26a74891031 100644 --- a/server/mpm_common.c +++ b/server/mpm_common.c @@ -635,7 +635,7 @@ static apr_status_t dummy_connection(ap_pod_t *pod) * requests in their logs. */ srequest = apr_pstrcat(p, "GET / HTTP/1.0\r\nUser-Agent: ", - ap_get_server_version(), + ap_get_server_banner(), " (internal dummy connection)\r\n\r\n", NULL); /* Since some operating systems support buffering of data or entire diff --git a/server/util_script.c b/server/util_script.c index 3be614d6554..62af577e080 100644 --- a/server/util_script.c +++ b/server/util_script.c @@ -223,7 +223,7 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) #endif apr_table_addn(e, "SERVER_SIGNATURE", ap_psignature("", r)); - apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_version()); + apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_banner()); apr_table_addn(e, "SERVER_NAME", ap_escape_html(r->pool, ap_get_server_name(r))); apr_table_addn(e, "SERVER_ADDR", r->connection->local_ip); /* Apache */