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; }