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 <harada sysrdc.ns-sol.co.jp>]
* 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
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
*/
/* 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;
ap_rputs(" </H1>\n", r);
ap_rputs(" <P>\n", r);
ap_rprintf(r, " Apache HTTP Server version: \"%s\"\n",
- ap_get_server_version());
+ ap_get_server_banner());
ap_rputs(" <BR>\n", r);
ap_rprintf(r, " Server built: \"%s\"\n", ap_get_server_built());
ap_rputs(" </P>\n", r);;
ap_rprintf(r,
"<dl><dt><strong>Server Version:</strong> "
"<font size=\"+1\"><tt>%s</tt></font></dt>\n",
- ap_get_server_version());
+ ap_get_server_description());
ap_rprintf(r,
"<dt><strong>Server Built:</strong> "
"<font size=\"+1\"><tt>%s</tt></font></dt>\n",
ap_rputs("<h1>Apache Server Status for ", r);
ap_rvputs(r, ap_get_server_name(r), "</h1>\n\n", NULL);
ap_rvputs(r, "<dl><dt>Server Version: ",
- ap_get_server_version(), "</dt>\n", NULL);
+ ap_get_server_description(), "</dt>\n", NULL);
ap_rvputs(r, "<dt>Server Built: ",
ap_get_server_built(), "\n</dt></dl><hr /><dl>\n", NULL);
ap_rvputs(r, "<dt>Current Time: ",
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 */
case 'S':
if (!strcmp(var, "SERVER_SOFTWARE")) {
- result = ap_get_server_version();
+ result = ap_get_server_banner();
}
break;
}
ap_rputs("<body><h1>Load Balancer Manager for ", r);
ap_rvputs(r, ap_get_server_name(r), "</h1>\n\n", NULL);
ap_rvputs(r, "<dl><dt>Server Version: ",
- ap_get_server_version(), "</dt>\n", NULL);
+ ap_get_server_description(), "</dt>\n", NULL);
ap_rvputs(r, "<dt>Server Built: ",
ap_get_server_built(), "\n</dt></dl>\n", NULL);
balancer = (proxy_balancer *)conf->balancers->elts;
"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 {
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
*/
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
}
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) {
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;
if (conf->server_signature == srv_sig_withmail) {
return apr_pstrcat(r->pool, prefix, "<address>",
- ap_get_server_version(),
+ ap_get_server_banner(),
" Server at <a href=\"",
ap_is_url(r->server->server_admin) ? "" : "mailto:",
ap_escape_html(r->pool, r->server->server_admin),
"</address>\n", NULL);
}
- return apr_pstrcat(r->pool, prefix, "<address>", ap_get_server_version(),
+ return apr_pstrcat(r->pool, prefix, "<address>", ap_get_server_banner(),
" Server at ",
ap_escape_html(r->pool, ap_get_server_name(r)),
" Port ", sport,
* 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 */
};
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;
}
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);
}
/*
- * 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,
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;
}
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);
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);
*/
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());
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());
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
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
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
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) {
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
request_count = 0;
ClearScreen (getscreenhandle());
- printf("%s \n", ap_get_server_version());
+ printf("%s \n", ap_get_server_description());
for (i=0;i<SERVER_NUM_STATUS;i++) {
status_array[i] = 0;
ap_listen_rec *lr;
module **m;
- printf("%s\n", ap_get_server_version());
+ printf("%s\n", ap_get_server_description());
if (ap_my_addrspace && (ap_my_addrspace[0] != 'O') && (ap_my_addrspace[1] != 'S'))
printf(" Running in address space %s\n", ap_my_addrspace);
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
restart();
}
else if (!strnicmp("VERSION",&szcommandLine[iCommandLen],3)) {
- 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());
}
else if (!strnicmp("MODULES",&szcommandLine[iCommandLen],3)) {
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
/* A real-honest to goodness parent */
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_NOTICE, 0, ap_server_conf,
"Server built: %s", ap_get_server_built());
/* Time to fix up the description, upon each successful restart
*/
- full_description = ap_get_server_version();
+ full_description = ap_get_server_description();
if ((osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
&& (osver.dwMajorVersion > 4)
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
* 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
#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 */