Author: rhuijben
Date: Tue Nov 17 23:19:45 2015
New Revision: 1714906
URL: http://svn.apache.org/viewvc?rev=1714906&view=rev
Log:
Make the new logging framework capable of handling incoming connections
and use this to enable logging in the httpd test app.
* config_store.c
(conn_key_for_conn): Use pointer value instead of integer value to
properly handle 64 bit platforms where int is 32 bit.
(apr handles %p specifically. %pp is like the usual %p)
(conn_key_for_client): New function.
(serf__config_store_get_client_config): New function, based on
serf__config_store_get_config.
* incoming.c
(client_connected): Resolve TODO.
(serf_incoming_create2): Initialize config.
* serf_private.h
(serf__config_store_get_client_config): New function.
* test/serf_httpd.c
(apr_getopt_option_t): Tweak some options.
(main): Allow logging. Use -V for version, -v for verbose.
Modified:
serf/trunk/config_store.c
serf/trunk/incoming.c
serf/trunk/serf_private.h
serf/trunk/test/serf_httpd.c
Modified: serf/trunk/config_store.c
URL:
http://svn.apache.org/viewvc/serf/trunk/config_store.c?rev=1714906&r1=1714905&r2=1714906&view=diff
==============================================================================
--- serf/trunk/config_store.c (original)
+++ serf/trunk/config_store.c Tue Nov 17 23:19:45 2015
@@ -70,7 +70,7 @@ add_or_replace_entry(serf__config_hdr_t
entry->key = key;
entry->value = value;
entry->next = NULL;
-
+
if (last)
last->next = entry;
else
@@ -106,9 +106,18 @@ static const char * conn_key_for_conn(se
apr_pool_t *pool)
{
/* Key needs to be unique per connection, so stringify its pointer value */
- return apr_psprintf(pool, "%x", (unsigned int)conn);
+ return apr_psprintf(pool, "%pp", conn);
}
+/* Defines the key to use for per connection settings */
+static const char * conn_key_for_client(serf_incoming_t *incoming,
+ apr_pool_t *pool)
+{
+ /* Key needs to be unique per connection, so stringify its pointer value */
+ return apr_psprintf(pool, "%pp", incoming);
+}
+
+
/* TODO: when will this be released? Related config to a specific lifecyle:
connection or context */
apr_status_t serf__config_store_get_config(serf_context_t *ctx,
@@ -162,6 +171,50 @@ apr_status_t serf__config_store_get_conf
apr_pool_destroy(tmp_pool);
}
+
+ *config = cfg;
+
+ return APR_SUCCESS;
+}
+
+apr_status_t serf__config_store_get_client_config(serf_context_t *ctx,
+ serf_incoming_t *client,
+ serf_config_t **config,
+ apr_pool_t *out_pool)
+{
+ serf__config_store_t *config_store = &ctx->config_store;
+
+ serf_config_t *cfg = apr_pcalloc(out_pool, sizeof(serf_config_t));
+ cfg->ctx_pool = ctx->pool;
+ cfg->per_context = config_store->global_per_context;
+
+ if (client) {
+ const char *client_key;
+ serf__config_hdr_t *per_conn;
+ apr_pool_t *tmp_pool;
+ apr_status_t status;
+
+ cfg->conn_pool = client->pool;
+
+ if ((status = apr_pool_create(&tmp_pool, out_pool)) != APR_SUCCESS)
+ return status;
+
+ /* Find the config values for this connection, create empty structure
+ if needed */
+ client_key = conn_key_for_client(client, tmp_pool);
+ per_conn = apr_hash_get(config_store->global_per_conn, client_key,
+ APR_HASH_KEY_STRING);
+ if (!per_conn) {
+ per_conn = create_config_hdr(client->pool);
+ apr_hash_set(config_store->global_per_conn,
+ apr_pstrdup(client->pool, client_key),
+ APR_HASH_KEY_STRING, per_conn);
+ }
+ cfg->per_conn = per_conn;
+ cfg->per_host = NULL;
+
+ apr_pool_destroy(tmp_pool);
+ }
*config = cfg;
Modified: serf/trunk/incoming.c
URL:
http://svn.apache.org/viewvc/serf/trunk/incoming.c?rev=1714906&r1=1714905&r2=1714906&view=diff
==============================================================================
--- serf/trunk/incoming.c (original)
+++ serf/trunk/incoming.c Tue Nov 17 23:19:45 2015
@@ -41,8 +41,20 @@ static apr_status_t client_connected(ser
/* serf_context_t *ctx = client->ctx; */
apr_status_t status;
serf_bucket_t *ostream;
+ apr_sockaddr_t *sa;
- /* ### TODO: Store ip address in config for logging */
+ if (apr_socket_addr_get(&sa, APR_LOCAL, client->skt) == APR_SUCCESS) {
+ char buf[48];
+ if (!apr_sockaddr_ip_getbuf(buf, sizeof(buf), sa))
+ serf_config_set_stringf(client->config, SERF_CONFIG_CONN_LOCALIP,
+ "%s:%d", buf, sa->port);
+ }
+ if (apr_socket_addr_get(&sa, APR_REMOTE, client->skt) == APR_SUCCESS) {
+ char buf[48];
+ if (!apr_sockaddr_ip_getbuf(buf, sizeof(buf), sa))
+ serf_config_set_stringf(client->config, SERF_CONFIG_CONN_REMOTEIP,
+ "%s:%d", buf, sa->port);
+ }
serf__log(LOGLVL_DEBUG, LOGCOMP_CONN, __FILE__, client->config,
"socket for client 0x%x connected\n", client);
@@ -718,6 +730,7 @@ apr_status_t serf_incoming_create2(
apr_status_t rv;
apr_pool_t *ic_pool;
serf_incoming_t *ic;
+ serf_config_t *config;
apr_pool_create(&ic_pool, pool);
@@ -762,14 +775,12 @@ apr_status_t serf_incoming_create2(
ic->seen_in_pollset = 0;
/* Store the connection specific info in the configuration store */
- /* ### Doesn't work... Doesn't support listeners yet*/
- /*rv = serf__config_store_get_config(ctx, ic, &config, pool);
+ rv = serf__config_store_get_client_config(ctx, ic, &config, pool);
if (rv) {
- apr_pool_destroy(l->pool);
- return rv;
+ apr_pool_destroy(ic->pool);
+ return rv;
}
- ic->config = config;*/
- ic->config = NULL; /* FIX!! */
+ ic->config = config;
rv = ctx->pollset_add(ctx->pollset_baton,
&ic->desc, &ic->baton);
Modified: serf/trunk/serf_private.h
URL:
http://svn.apache.org/viewvc/serf/trunk/serf_private.h?rev=1714906&r1=1714905&r2=1714906&view=diff
==============================================================================
--- serf/trunk/serf_private.h (original)
+++ serf/trunk/serf_private.h Tue Nov 17 23:19:45 2015
@@ -282,6 +282,13 @@ apr_status_t serf__config_store_get_conf
serf_config_t **config,
apr_pool_t *out_pool);
+/* Same thing, but for incoming connections */
+apr_status_t serf__config_store_get_client_config(serf_context_t *ctx,
+ serf_incoming_t *client,
+ serf_config_t **config,
+ apr_pool_t *out_pool);
+
+
/* Cleans up all connection specific configuration values */
apr_status_t
serf__config_store_remove_connection(serf__config_store_t config_store,
Modified: serf/trunk/test/serf_httpd.c
URL:
http://svn.apache.org/viewvc/serf/trunk/test/serf_httpd.c?rev=1714906&r1=1714905&r2=1714906&view=diff
==============================================================================
--- serf/trunk/test/serf_httpd.c (original)
+++ serf/trunk/test/serf_httpd.c Tue Nov 17 23:19:45 2015
@@ -276,8 +276,9 @@ static const apr_getopt_option_t options
{
{ "help", 'h', 0, "Display this help" },
- { NULL, 'v', 0, "Display version" },
+ { "version", 'V', 0, "Display version" },
{ "listen", 'l', 1, "<[protocol,][host:]port> Configure listener"},
+ { "verbose", 'v', 0, "Enable debug logging" },
/* { NULL, 'H', 0, "Print response headers" },
{ NULL, 'n', 1, "<count> Fetch URL <count> times" },
{ NULL, 'c', 1, "<count> Use <count> concurrent connections" },
@@ -290,7 +291,6 @@ static const apr_getopt_option_t options
{ "cert", CERTFILE, 1, "<file> Use SSL client certificate <file>" },
{ "certpwd", CERTPWD, 1, "<password> Password for the SSL client
certificate" },
{ NULL, 'r', 1, "<header:value> Use <header:value> as request header"
},
- { "debug", 'd', 0, "Enable debugging" },
{ "http2", HTTP2FLAG, 0, "Enable http2 (https only) (Experimental)" },
{ "h2direct",H2DIRECT, 0, "Enable h2direct (Experimental)" },*/
@@ -380,6 +380,7 @@ int main(int argc, const char **argv)
apr_getopt_t *opt;
apr_allocator_t *allocator;
int opt_c;
+ int verbose = 0;
const char *opt_arg;
const char *root_dir;
@@ -427,12 +428,16 @@ int main(int argc, const char **argv)
print_usage(scratch_pool);
exit(0);
break;
- case 'v':
+ case 'V':
puts("Serf version: " SERF_VERSION_STRING);
exit(0);
case 'l':
configure_listener(context, &app_ctx, opt_arg, app_pool);
break;
+ case 'v':
+ verbose++;
+ break;
+
default:
break;
}
@@ -445,6 +450,24 @@ int main(int argc, const char **argv)
root_dir = argv[opt->ind];
+ /* Setup debug logging */
+ if (verbose) {
+ serf_log_output_t *output;
+ apr_status_t status;
+
+ status = serf_logging_create_stream_output(
+ &output,
+ context,
+ SERF_LOG_INFO,
+ SERF_LOGCOMP_ALL_MSG & ~(SERF_LOGCOMP_RAWMSG |
SERF_LOGCOMP_SSLMSG),
+ SERF_LOG_DEFAULT_LAYOUT,
+ stderr,
+ app_pool);
+
+ if (!status)
+ serf_logging_add_output(context, output);
+ }
+
while (1) {
apr_pool_clear(scratch_pool);
status = serf_context_run(context, apr_time_from_msec(50),