|
@@ -2039,6 +2039,101 @@ START_TEST(test_handle_form)
|
|
|
END_TEST
|
|
|
|
|
|
|
|
|
+START_TEST(test_http_auth)
|
|
|
+{
|
|
|
+#if !defined(NO_FILES)
|
|
|
+ struct mg_context *ctx;
|
|
|
+ struct mg_connection *client_conn;
|
|
|
+ char client_err[256];
|
|
|
+ const struct mg_request_info *client_ri;
|
|
|
+ int client_res;
|
|
|
+ FILE * f;
|
|
|
+ const char *test_content = "test_http_auth test_file content";
|
|
|
+ const char *domain;
|
|
|
+ size_t len;
|
|
|
+
|
|
|
+ memset(errmsg, 0, sizeof(errmsg));
|
|
|
+
|
|
|
+ mark_point();
|
|
|
+ /* Start with default options */
|
|
|
+ ctx = mg_start(NULL, NULL, NULL);
|
|
|
+ test_sleep(1);
|
|
|
+
|
|
|
+ ck_assert(ctx != NULL);
|
|
|
+ domain = mg_get_option(ctx, "authentication_domain");
|
|
|
+ ck_assert(domain != NULL);
|
|
|
+ len = strlen(domain);
|
|
|
+ ck_assert_uint_gt(domain, 0);
|
|
|
+ ck_assert_uint_lt(domain, 64);
|
|
|
+
|
|
|
+ /* Create a default file in the document root */
|
|
|
+ f = fopen("test_http_auth.test_file.txt", "w");
|
|
|
+ if (f) {
|
|
|
+ fprintf(f, "%s", test_content);
|
|
|
+ fclose(f);
|
|
|
+ } else {
|
|
|
+ ck_assert_abort_msg(f, "Cannot create file test_http_auth.test_file.txt");
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Read file before a .htpasswd file has been created */
|
|
|
+ memset(client_err, 0, sizeof(client_err));
|
|
|
+ client_conn =
|
|
|
+ mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ ck_assert_str_eq(client_err, "");
|
|
|
+ mg_printf(client_conn, "GET / HTTP/1.0\r\n\r\n");
|
|
|
+ client_res =
|
|
|
+ mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
|
|
|
+ ck_assert_int_ge(client_res, 0);
|
|
|
+ ck_assert_str_eq(client_err, "");
|
|
|
+ client_ri = mg_get_request_info(client_conn);
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+
|
|
|
+ ck_assert_str_eq(client_ri->uri, "200");
|
|
|
+ client_res = (int)mg_read(client_conn, client_err, sizeof(client_err));
|
|
|
+ ck_assert_int_gt(client_res, 0);
|
|
|
+ ck_assert_int_le(client_res, sizeof(client_err));
|
|
|
+ ck_assert_str_eq(client_res, test_content);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ test_sleep(1);
|
|
|
+
|
|
|
+ /* Create a .htpasswd file */
|
|
|
+ client_res = mg_modify_passwords_file(".htpasswd", domain, "user", "pass");
|
|
|
+ ck_assert_int_eq(client_res, 1);
|
|
|
+
|
|
|
+ client_res = mg_modify_passwords_file(NULL, domain, "user", "pass");
|
|
|
+ ck_assert_int_eq(client_res, 0); /* Filename is required */
|
|
|
+
|
|
|
+ test_sleep(1);
|
|
|
+
|
|
|
+ /* Repeat test after .htpasswd is created */
|
|
|
+ memset(client_err, 0, sizeof(client_err));
|
|
|
+ client_conn =
|
|
|
+ mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ ck_assert_str_eq(client_err, "");
|
|
|
+ mg_printf(client_conn, "GET / HTTP/1.0\r\n\r\n");
|
|
|
+ client_res =
|
|
|
+ mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
|
|
|
+ ck_assert_int_ge(client_res, 0);
|
|
|
+ ck_assert_str_eq(client_err, "");
|
|
|
+ client_ri = mg_get_request_info(client_conn);
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+
|
|
|
+ ck_assert_str_eq(client_ri->uri, "401");
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ test_sleep(1);
|
|
|
+
|
|
|
+
|
|
|
+ mg_stop(ctx);
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+END_TEST
|
|
|
+
|
|
|
+
|
|
|
Suite *
|
|
|
make_public_server_suite(void)
|
|
|
{
|
|
@@ -2051,6 +2146,7 @@ make_public_server_suite(void)
|
|
|
TCase *const tcase_serverandclienttls = tcase_create("TLS Server Client");
|
|
|
TCase *const tcase_serverrequests = tcase_create("Server Requests");
|
|
|
TCase *const tcase_handle_form = tcase_create("Handle Form");
|
|
|
+ TCase *const tcase_http_auth = tcase_create("HTTP Authentication");
|
|
|
|
|
|
tcase_add_test(tcase_checktestenv, test_the_test_environment);
|
|
|
tcase_set_timeout(tcase_checktestenv, civetweb_min_test_timeout);
|
|
@@ -2080,6 +2176,10 @@ make_public_server_suite(void)
|
|
|
tcase_set_timeout(tcase_handle_form, 60);
|
|
|
suite_add_tcase(suite, tcase_handle_form);
|
|
|
|
|
|
+ tcase_add_test(tcase_http_auth, test_http_auth);
|
|
|
+ tcase_set_timeout(tcase_http_auth, 60);
|
|
|
+ suite_add_tcase(suite, tcase_http_auth);
|
|
|
+
|
|
|
return suite;
|
|
|
}
|
|
|
|