Author: rhuijben
Date: Thu Nov 19 11:17:33 2015
New Revision: 1715159
URL: http://svn.apache.org/viewvc?rev=1715159&view=rev
Log:
In the http2 handler: route the response through the outgoing request handler
to properly route through the auth layer.
* protocols/http2_stream.c
(serf_http2__stream_processor): Use helper method.
* test/test_server.c
(client_generate_response): Add alternative result.
(authn_callback): New function.
(test_listen_auth_http,
test_listen_auth_http2): New tests.
(test_server): Add tests.
Modified:
serf/trunk/protocols/http2_stream.c
serf/trunk/test/test_server.c
Modified: serf/trunk/protocols/http2_stream.c
URL:
http://svn.apache.org/viewvc/serf/trunk/protocols/http2_stream.c?rev=1715159&r1=1715158&r2=1715159&view=diff
==============================================================================
--- serf/trunk/protocols/http2_stream.c (original)
+++ serf/trunk/protocols/http2_stream.c Thu Nov 19 11:17:33 2015
@@ -697,9 +697,7 @@ serf_http2__stream_processor(void *baton
SERF_H2_assert(request->resp_bkt != NULL);
- status = request->handler(request, request->resp_bkt,
- request->handler_baton,
- request->respool);
+ status = serf__handle_response(request, request->respool);
if (!APR_STATUS_IS_EOF(status)
&& !SERF_BUCKET_READ_ERROR(status))
Modified: serf/trunk/test/test_server.c
URL:
http://svn.apache.org/viewvc/serf/trunk/test/test_server.c?rev=1715159&r1=1715158&r2=1715159&view=diff
==============================================================================
--- serf/trunk/test/test_server.c (original)
+++ serf/trunk/test/test_server.c Thu Nov 19 11:17:33 2015
@@ -72,14 +72,26 @@ static apr_status_t client_generate_resp
serf_bucket_alloc_t *allocator,
apr_pool_t *pool)
{
+ test_baton_t *tb = setup_baton;
serf_bucket_t *tmp;
#define CRLF "\r\n"
- tmp = SERF_BUCKET_SIMPLE_STRING("HTTP/1.1 200 OK" CRLF
- "Content-Length: 4" CRLF
- CRLF
- "OK" CRLF,
- allocator);
+ if (tb->user_baton_l == 401) {
+ tb->user_baton_l = 0;
+
+ tmp = SERF_BUCKET_SIMPLE_STRING("HTTP/1.1 401 Unauth" CRLF
+ "WWW-Authenticate: Basic realm=\"Test Suite\"" CRLF
+ "Content-Length: 4" CRLF
+ CRLF
+ "OK" CRLF,
+ allocator);
+ }
+ else
+ tmp = SERF_BUCKET_SIMPLE_STRING("HTTP/1.1 200 OK" CRLF
+ "Content-Length: 4" CRLF
+ CRLF
+ "OK" CRLF,
+ allocator);
*resp_bkt = tmp;
return APR_SUCCESS;
@@ -240,6 +252,82 @@ void test_listen_http2(CuTest *tc)
CuAssertIntEquals(tc, APR_SUCCESS, status);
}
+static apr_status_t authn_callback(char **username,
+ char **password,
+ serf_request_t *request, void *baton,
+ int code, const char *authn_type,
+ const char *realm,
+ apr_pool_t *pool)
+{
+ handler_baton_t *handler_ctx = baton;
+ test_baton_t *tb = handler_ctx->tb;
+
+ /* Skip "<http://localhost...." */
+ realm = strchr(realm, '>');
+
+ CuAssertStrEquals(tb->user_baton, "> Test Suite", realm);
+ *username = "serf";
+ *password = "fres";
+
+ return APR_SUCCESS;
+}
+
+
+void test_listen_auth_http(CuTest *tc)
+{
+ test_baton_t *tb = tc->testBaton;
+ apr_status_t status;
+ handler_baton_t handler_ctx[2];
+ const int num_requests = sizeof(handler_ctx) / sizeof(handler_ctx[0]);
+
+ setup_test_server(tb);
+
+ status = setup_test_client_context(tb, NULL, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+
+ serf_config_authn_types(tb->context, SERF_AUTHN_ALL);
+ serf_config_credentials_callback(tb->context,
+ authn_callback);
+
+ create_new_request(tb, &handler_ctx[0], "GET", "/", 1);
+ create_new_request(tb, &handler_ctx[1], "GET", "/", 2);
+
+ tb->user_baton_l = 401;
+ tb->user_baton = tc;
+
+ status = run_client_server_loop(tb, num_requests,
+ handler_ctx, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+}
+
+void test_listen_auth_http2(CuTest *tc)
+{
+ test_baton_t *tb = tc->testBaton;
+ apr_status_t status;
+ handler_baton_t handler_ctx[2];
+ const int num_requests = sizeof(handler_ctx) / sizeof(handler_ctx[0]);
+
+ setup_test_server(tb);
+
+ status = setup_test_client_context(tb, connection_setup_http2,
+ tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+
+ serf_config_authn_types(tb->context, SERF_AUTHN_ALL);
+ serf_config_credentials_callback(tb->context,
+ authn_callback);
+
+ create_new_request(tb, &handler_ctx[0], "GET", "/", 1);
+ create_new_request(tb, &handler_ctx[1], "GET", "/", 2);
+
+ tb->user_baton_l = 401;
+ tb->user_baton = tc;
+
+ status = run_client_server_loop(tb, num_requests,
+ handler_ctx, tb->pool);
+ CuAssertIntEquals(tc, APR_SUCCESS, status);
+}
+
/*****************************************************************************/
CuSuite *test_server(void)
{
@@ -250,5 +338,8 @@ CuSuite *test_server(void)
SUITE_ADD_TEST(suite, test_listen_http);
SUITE_ADD_TEST(suite, test_listen_http2);
+ SUITE_ADD_TEST(suite, test_listen_auth_http);
+ SUITE_ADD_TEST(suite, test_listen_auth_http2);
+
return suite;
}