Author: brane
Date: Sun Jun 15 19:37:52 2025
New Revision: 1926449
URL: http://svn.apache.org/viewvc?rev=1926449&view=rev
Log:
On the user-defined-authn branch: Add context to the register/unregister
funcions to that we can have stable error logging, plus minor cleanup.
* serf.h
(serf_authn_register_scheme): Add a serf_context_t argument and update
the docstring.
(serf_authn_unregister_scheme): Likewise (though it's still disabled).
* auth/auth.h
(serf__authn__unregister_scheme): Add the serf_context_t argument.
(serf__authn_user__handle): Rename from serf__authn_user__handler.
* auth/auth.c
(lock_authn_schemes): Rename from lock_autn_schemes.
(unlock_authn_schemes): Rename from unlock_autn_schemes.
(serf_authn_register_scheme,
serf__authn__unregister_scheme): Implement the serf_context_t argument.
* auth/auth_user_defined.c
(serf__authn_user__handle): Rename from serf__authn_user__handler.
* test/test_serf.h
(setup_test_context): Declare a new utility function.
* test/test_util.c
(setup_test_context): Implement it here, with optional logging.
(setup_test_client_context,
setup_test_client_context_with_proxy): Use setup_test_context for the
basic context setup.
Modified:
serf/branches/user-defined-authn/auth/auth.c
serf/branches/user-defined-authn/auth/auth.h
serf/branches/user-defined-authn/auth/auth_user_defined.c
serf/branches/user-defined-authn/serf.h
serf/branches/user-defined-authn/test/test_auth.c
serf/branches/user-defined-authn/test/test_serf.h
serf/branches/user-defined-authn/test/test_util.c
Modified: serf/branches/user-defined-authn/auth/auth.c
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth.c?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth.c (original)
+++ serf/branches/user-defined-authn/auth/auth.c Sun Jun 15 19:37:52 2025
@@ -72,7 +72,7 @@ static apr_pool_t *authn_schemes_guard_p
static apr_status_t init_authn_schemes_guard();
#endif
-static apr_status_t lock_autn_schemes(serf_config_t *config)
+static apr_status_t lock_authn_schemes(serf_config_t *config)
{
#if APR_HAS_THREADS
apr_status_t status = init_authn_schemes_guard();
@@ -91,7 +91,7 @@ static apr_status_t lock_autn_schemes(se
#endif
}
-static apr_status_t unlock_autn_schemes(serf_config_t *config)
+static apr_status_t unlock_authn_schemes(serf_config_t *config)
{
#if APR_HAS_THREADS
apr_status_t status = init_authn_schemes_guard();
@@ -147,7 +147,7 @@ static int handle_auth_headers(int code,
serf_context_t *ctx = conn->ctx;
apr_status_t status, lock_status;
- lock_status = lock_autn_schemes(conn->config);
+ lock_status = lock_authn_schemes(conn->config);
if (lock_status)
return lock_status;
@@ -230,7 +230,7 @@ static int handle_auth_headers(int code,
authn_info->failed_authn_types |= scheme->type;
}
- lock_status = unlock_autn_schemes(conn->config);
+ lock_status = unlock_authn_schemes(conn->config);
if (lock_status)
return lock_status;
@@ -623,7 +623,8 @@ static unsigned int find_next_user_schem
return avail & -avail;
}
-apr_status_t serf_authn_register_scheme(const char *name,
+apr_status_t serf_authn_register_scheme(serf_context_t *ctx,
+ const char *name,
void *baton,
apr_pool_t *result_pool,
int *type)
@@ -649,7 +650,7 @@ apr_status_t serf_authn_register_scheme(
authn_scheme->key = key;
/* user_scheme->type = ?; Will be updated later, under lock. */
authn_scheme->init_conn_func = serf__authn_user__init_conn;
- authn_scheme->handle_func = serf__authn_user__handler;
+ authn_scheme->handle_func = serf__authn_user__handle;
authn_scheme->setup_request_func = serf__authn_user__setup_request;
authn_scheme->validate_response_func = serf__authn_user__validate_response;
@@ -657,7 +658,7 @@ apr_status_t serf_authn_register_scheme(
authn_scheme->magic = serf__authn_user__magic;
authn_scheme->baton = baton;
- lock_status = lock_autn_schemes(NULL /* TODO: whence cometh config? */);
+ lock_status = lock_authn_schemes(ctx->config);
if (lock_status)
return lock_status;
@@ -699,16 +700,18 @@ apr_status_t serf_authn_register_scheme(
user_authn_registered |= scheme_type;
cleanup:
- lock_status = unlock_autn_schemes(NULL /* TODO: whence cometh config? */);
+ lock_status = unlock_authn_schemes(ctx->config);
if (lock_status)
return lock_status;
return status;
}
-/* apr_status_t serf_authn_unregister_scheme(int type, */
+/* apr_status_t serf_authn_unregister_scheme(serf_context_t *ctx, */
+/* int type, */
/* const char *name, */
-/* apr_pool_t *scratch_pool) */
-apr_status_t serf__authn__unregister_scheme(int type,
+/* apr_pool_t *scratch_pool); */
+apr_status_t serf__authn__unregister_scheme(serf_context_t *ctx,
+ int type,
const char *name,
apr_pool_t *scratch_pool)
{
@@ -726,7 +729,7 @@ apr_status_t serf__authn__unregister_sch
++cp;
}
- lock_status = lock_autn_schemes(NULL /* TODO: whence cometh config? */);
+ lock_status = lock_authn_schemes(ctx->config);
if (lock_status)
return lock_status;
@@ -764,7 +767,7 @@ apr_status_t serf__authn__unregister_sch
user_authn_registered &= ~scheme_type;
cleanup:
- lock_status = unlock_autn_schemes(NULL /* TODO: whence cometh config? */);
+ lock_status = unlock_authn_schemes(ctx->config);
if (lock_status)
return lock_status;
return status;
Modified: serf/branches/user-defined-authn/auth/auth.h
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth.h?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth.h (original)
+++ serf/branches/user-defined-authn/auth/auth.h Sun Jun 15 19:37:52 2025
@@ -165,7 +165,8 @@ extern const serf__authn_scheme_t serf__
/** User-defined authentication scheme handlers */
/* FIXME: Declare the prototype for the internal unregister implementation */
-apr_status_t serf__authn__unregister_scheme(int type,
+apr_status_t serf__authn__unregister_scheme(serf_context_t *ctx,
+ int type,
const char *name,
apr_pool_t *scratch_pool);
@@ -176,13 +177,13 @@ serf__authn_user__init_conn(const serf__
apr_pool_t *pool);
apr_status_t
-serf__authn_user__handler(const serf__authn_scheme_t *scheme,
- int code,
- serf_request_t *request,
- serf_bucket_t *response,
- const char *auth_hdr,
- const char *auth_attr,
- apr_pool_t *pool);
+serf__authn_user__handle(const serf__authn_scheme_t *scheme,
+ int code,
+ serf_request_t *request,
+ serf_bucket_t *response,
+ const char *auth_hdr,
+ const char *auth_attr,
+ apr_pool_t *pool);
apr_status_t
serf__authn_user__setup_request(const serf__authn_scheme_t *scheme,
Modified: serf/branches/user-defined-authn/auth/auth_user_defined.c
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_user_defined.c?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth_user_defined.c (original)
+++ serf/branches/user-defined-authn/auth/auth_user_defined.c Sun Jun 15
19:37:52 2025
@@ -45,13 +45,13 @@ serf__authn_user__init_conn(const serf__
}
apr_status_t
-serf__authn_user__handler(const serf__authn_scheme_t *scheme,
- int code,
- serf_request_t *request,
- serf_bucket_t *response,
- const char *auth_hdr,
- const char *auth_attr,
- apr_pool_t *pool)
+serf__authn_user__handle(const serf__authn_scheme_t *scheme,
+ int code,
+ serf_request_t *request,
+ serf_bucket_t *response,
+ const char *auth_hdr,
+ const char *auth_attr,
+ apr_pool_t *pool)
{
if (!validate_user_authn(scheme))
return APR_EINVAL;
Modified: serf/branches/user-defined-authn/serf.h
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/serf.h?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/serf.h (original)
+++ serf/branches/user-defined-authn/serf.h Sun Jun 15 19:37:52 2025
@@ -977,6 +977,8 @@ serf_bucket_t *serf_request_bucket_reque
* authorization headers. It must be a valid token as defined in RFC-9110
* (see reference, below).
*
+ * The context in @a ctx is used for logging.
+ *
* Internal structures related to this provider will be allocated from
* @a result_pool, so take care that it lives as long as the autehtication
* scheme is registered.
@@ -984,8 +986,8 @@ serf_bucket_t *serf_request_bucket_reque
* @see https://www.rfc-editor.org/rfc/rfc9110#section-11.1
* @since New in 1.4
*/
-
-apr_status_t serf_authn_register_scheme(const char *name,
+apr_status_t serf_authn_register_scheme(serf_context_t *ctx,
+ const char *name,
void *baton,
apr_pool_t *result_pool,
int *type);
@@ -1000,6 +1002,8 @@ apr_status_t serf_authn_register_scheme(
* temporary allocations; this pool can be destroyed afterthe function
* returns.
*
+ * The context in @a ctx is used for logging.
+ *
* Unregistering a scheme should be avoided while requests that might
* use the scheme are in flight.
*
@@ -1007,7 +1011,8 @@ apr_status_t serf_authn_register_scheme(
*
* @since New in 1.4
*/
-/* apr_status_t serf_authn_unregister_scheme(int type, */
+/* apr_status_t serf_authn_unregister_scheme(serf_context_t *ctx, */
+/* int type, */
/* const char *name, */
/* apr_pool_t *scratch_pool); */
Modified: serf/branches/user-defined-authn/test/test_auth.c
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_auth.c?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/test/test_auth.c (original)
+++ serf/branches/user-defined-authn/test/test_auth.c Sun Jun 15 19:37:52 2025
@@ -513,9 +513,10 @@ static void test_auth_on_HEAD(CuTest *tc
/* FIXME: Temporary rename of the unregister function. */
-#define serf_authn_unregister_scheme(type, name, scratch_pool) \
- serf__authn__unregister_scheme((type), (name), (scratch_pool))
-apr_status_t serf__authn__unregister_scheme(int type,
+#define serf_authn_unregister_scheme(ctx, type, name, scratch_pool) \
+ serf__authn__unregister_scheme((ctx), (type), (name), (scratch_pool))
+apr_status_t serf__authn__unregister_scheme(serf_context_t *ctx,
+ int type,
const char *name,
apr_pool_t *scratch_pool);
@@ -526,13 +527,18 @@ static void test_authn_register_one(CuTe
apr_status_t status;
int type;
+ status = setup_test_context(tb, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+
/* Register an authentication scheme */
- status = serf_authn_register_scheme("Fizzle", baton, tb->pool, &type);
+ status = serf_authn_register_scheme(tb->context,
+ "Fizzle", baton, tb->pool, &type);
CuAssertIntEquals(tc, APR_SUCCESS, status);
CuAssertTrue(tc, type != SERF_AUTHN_NONE);
/* Unregister the scheme */
- status = serf_authn_unregister_scheme(type, "fiZzlE", tb->pool);
+ status = serf_authn_unregister_scheme(tb->context,
+ type, "fiZzlE", tb->pool);
CuAssertIntEquals(tc, APR_SUCCESS, status);
}
@@ -544,20 +550,27 @@ static void test_authn_register_two(CuTe
apr_status_t status;
int type1, type2;
+ status = setup_test_context(tb, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+
/* Register the schemes */
- status = serf_authn_register_scheme("Tweedledee", baton1, tb->pool,
&type1);
+ status = serf_authn_register_scheme(tb->context,
+ "Tweedledee", baton1, tb->pool,
&type1);
CuAssertIntEquals(tc, APR_SUCCESS, status);
CuAssertTrue(tc, type1 != SERF_AUTHN_NONE);
- status = serf_authn_register_scheme("Tweedledum", baton2, tb->pool,
&type2);
+ status = serf_authn_register_scheme(tb->context,
+ "Tweedledum", baton2, tb->pool,
&type2);
CuAssertIntEquals(tc, APR_SUCCESS, status);
CuAssertTrue(tc, type2 != SERF_AUTHN_NONE);
CuAssertTrue(tc, type2 != type1);
/* Unregister the schemes */
- status =serf_authn_unregister_scheme(type1, "tweedleDee", tb->pool);
+ status =serf_authn_unregister_scheme(tb->context,
+ type1, "tweedleDee", tb->pool);
CuAssertIntEquals(tc, APR_SUCCESS, status);
- status =serf_authn_unregister_scheme(type2, "tweedleDum", tb->pool);
+ status =serf_authn_unregister_scheme(tb->context,
+ type2, "tweedleDum", tb->pool);
CuAssertIntEquals(tc, APR_SUCCESS, status);
}
@@ -568,17 +581,23 @@ static void test_authn_register_twice(Cu
apr_status_t status;
int type, epyt;
+ status = setup_test_context(tb, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+
/* Register an authentication scheme */
- status = serf_authn_register_scheme("Tweens", baton, tb->pool, &type);
+ status = serf_authn_register_scheme(tb->context,
+ "Tweens", baton, tb->pool, &type);
CuAssertIntEquals(tc, APR_SUCCESS, status);
CuAssertTrue(tc, type != SERF_AUTHN_NONE);
- status = serf_authn_register_scheme("Tweens", baton, tb->pool, &epyt);
+ status = serf_authn_register_scheme(tb->context,
+ "Tweens", baton, tb->pool, &epyt);
CuAssertIntEquals(tc, APR_EEXIST, status);
CuAssertTrue(tc, epyt == SERF_AUTHN_NONE);
/* Unregister the scheme */
- status =serf_authn_unregister_scheme(type, "Tweens", tb->pool);
+ status =serf_authn_unregister_scheme(tb->context,
+ type, "Tweens", tb->pool);
CuAssertIntEquals(tc, APR_SUCCESS, status);
}
@@ -587,8 +606,12 @@ static void test_authn_unregister_unknow
test_baton_t *tb = tc->testBaton;
apr_status_t status;
+ status = setup_test_context(tb, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+
/* Unregister the scheme */
- status = serf_authn_unregister_scheme(1 << 15, "Neverland", tb->pool);
+ status = serf_authn_unregister_scheme(tb->context,
+ 1 << 15, "Neverland", tb->pool);
CuAssertIntEquals(tc, APR_ENOENT, status);
}
Modified: serf/branches/user-defined-authn/test/test_serf.h
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_serf.h?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/test/test_serf.h (original)
+++ serf/branches/user-defined-authn/test/test_serf.h Sun Jun 15 19:37:52 2025
@@ -241,6 +241,9 @@ serf_bucket_t *serf_bucket_mock_sock_cre
/* Test utility functions, to be used with the MockHTTPinC framework */
/*****************************************************************************/
+/* Initiate a simple serf context with no connections. */
+apr_status_t setup_test_context(test_baton_t *tb, apr_pool_t *pool);
+
/* Initiate a serf context configured to connect to the mock http server */
apr_status_t setup_test_client_context(test_baton_t *tb,
serf_connection_setup_t conn_setup,
@@ -295,7 +298,7 @@ run_client_and_mock_servers_loops_expect
handler_baton_t handler_ctx[],
apr_pool_t *pool);
-/* Logs a test suite error with its code location, and return status
+/* Logs a test suite error with its code location, and return status
SERF_ERROR_ISSUE_IN_TESTSUITE. */
#define REPORT_TEST_SUITE_ERROR()\
test__report_suite_error(__FILE__, __LINE__)
Modified: serf/branches/user-defined-authn/test/test_util.c
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_util.c?rev=1926449&r1=1926448&r2=1926449&view=diff
==============================================================================
--- serf/branches/user-defined-authn/test/test_util.c (original)
+++ serf/branches/user-defined-authn/test/test_util.c Sun Jun 15 19:37:52 2025
@@ -422,18 +422,40 @@ apr_status_t dummy_authn_callback(char *
/*****************************************************************************/
apr_status_t
+setup_test_context(test_baton_t *tb, apr_pool_t *pool)
+{
+ serf_log_output_t *output;
+ apr_status_t status = APR_SUCCESS;
+
+ if (!tb->context)
+ tb->context = serf_context_create(pool);
+
+ if (TEST_VERBOSE) {
+ status = serf_logging_create_stream_output(&output, tb->context,
+ SERF_LOG_DEBUG,
+ SERF_LOGCOMP_ALL,
+ SERF_LOG_DEFAULT_LAYOUT,
+ stderr, pool);
+ if (status == APR_SUCCESS)
+ status = serf_logging_add_output(tb->context, output);
+ }
+
+ return status;
+}
+
+apr_status_t
setup_test_client_context(test_baton_t *tb,
serf_connection_setup_t conn_setup,
apr_pool_t *pool)
{
apr_status_t status;
- if (!tb->context)
- tb->context = serf_context_create(pool);
-
- tb->conn_setup = conn_setup ? conn_setup :
- default_http_conn_setup;
- status = use_new_connection(tb, pool);
+ status = setup_test_context(tb, pool);
+ if (status == APR_SUCCESS) {
+ tb->conn_setup = conn_setup ? conn_setup :
+ default_http_conn_setup;
+ status = use_new_connection(tb, pool);
+ }
return status;
}
@@ -447,7 +469,7 @@ setup_test_client_https_context(test_bat
apr_status_t status;
status = setup_test_client_context(tb,
- conn_setup ? conn_setup:
+ conn_setup ? conn_setup :
default_https_conn_setup,
pool);
tb->server_cert_cb = server_cert_cb;
@@ -462,14 +484,16 @@ setup_test_client_context_with_proxy(tes
{
apr_status_t status;
- tb->context = serf_context_create(pool);
- tb->conn_setup = conn_setup ? conn_setup :
- default_http_conn_setup;
+ status = setup_test_context(tb, pool);
+ if (status == APR_SUCCESS) {
+ tb->conn_setup = conn_setup ? conn_setup :
+ default_http_conn_setup;
- /* Configure serf to use the proxy server */
- serf_config_proxy(tb->context, tb->proxy_addr);
+ /* Configure serf to use the proxy server */
+ serf_config_proxy(tb->context, tb->proxy_addr);
- status = use_new_connection(tb, pool);
+ status = use_new_connection(tb, pool);
+ }
return status;
}
@@ -483,7 +507,7 @@ setup_serf_https_context_with_proxy(test
apr_status_t status;
status = setup_test_client_context_with_proxy(tb,
- conn_setup ? conn_setup:
+ conn_setup ? conn_setup :
default_https_conn_setup,
pool);
tb->server_cert_cb = server_cert_cb;
@@ -513,7 +537,7 @@ run_client_and_mock_servers_loops(test_b
/* run server event loop */
err = mhRunServerLoop(mh);
- /* Even if the mock server returned an error, it may have written
+ /* Even if the mock server returned an error, it may have written
something to the client. So process that data first, handle the
error
later. */
@@ -534,7 +558,7 @@ run_client_and_mock_servers_loops(test_b
return REPORT_TEST_SUITE_ERROR();
}
apr_pool_destroy(iter_pool);
-
+
return APR_SUCCESS;
}