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


Reply via email to