void test_tmpl_url_for_with_script_name(void) { g_setenv("PATH_INFO", "/", TRUE); g_setenv("REQUEST_METHOD", "GET", TRUE); g_setenv("SCRIPT_NAME", "/foo/bar", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app, balde_sapi_cgi_parse_request(app)); balde_app_add_url_rule(app, "arcoiro", "/arcoiro/<bola>/<guda>/", BALDE_HTTP_GET, arcoiro_view); balde_app_add_url_rule(app, "arcoiro2", "/arco/<iro>", BALDE_HTTP_GET, arcoiro_view); gchar *url = balde_tmpl_url_for(app, request, "arcoiro", FALSE, "chunda", "guto"); g_assert_cmpstr(url, ==, "/foo/bar/arcoiro/chunda/guto/"); g_free(url); url = balde_tmpl_url_for(app, request, "arcoiro2", FALSE, "bola"); g_assert_cmpstr(url, ==, "/foo/bar/arco/bola"); g_free(url); url = balde_tmpl_url_for(app, request, "static", FALSE, "foo/jquery-min.js"); g_assert_cmpstr(url, ==, "/foo/bar/static/foo/jquery-min.js"); g_free(url); balde_request_free(request); balde_app_free(app); g_unsetenv("SCRIPT_NAME"); g_unsetenv("REQUEST_METHOD"); g_unsetenv("PATH_INFO"); }
void test_make_request(void) { g_setenv("HTTP_LOL_HEHE", "12345", TRUE); g_setenv("HTTP_XD_KKK", "asdf", TRUE); g_setenv("HTTP_COOKIE", "asd=\"qwe\"; bola=guda", TRUE); g_setenv("HTTP_AUTHORIZATION", "Basic Ym9sYTpndWRhOmxvbA==", TRUE); g_setenv("PATH_INFO", "/", TRUE); g_setenv("REQUEST_METHOD", "GET", TRUE); g_setenv("QUERY_STRING", "asd=lol&xd=hehe", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app); g_assert_cmpstr(request->path, ==, "/"); g_assert(request->method == BALDE_HTTP_GET); g_assert(g_hash_table_size(request->headers) == 4); g_assert(g_hash_table_size(request->args) == 2); g_assert(g_hash_table_size(request->cookies) == 2); g_assert(request->authorization != NULL); g_assert_cmpstr(request->authorization->username, ==, "bola"); g_assert_cmpstr(request->authorization->password, ==, "guda:lol"); g_assert(request->view_args == NULL); balde_request_free(request); balde_app_free(app); }
void test_app_url_for(void) { g_setenv("PATH_INFO", "/", TRUE); g_setenv("REQUEST_METHOD", "GET", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app, NULL); balde_app_add_url_rule(app, "arcoiro", "/arcoiro/<bola>/<guda>/", BALDE_HTTP_GET, arcoiro_view); balde_app_add_url_rule(app, "arcoiro2", "/arco/<iro>", BALDE_HTTP_GET, arcoiro_view); gchar *url = balde_app_url_for(app, request, "arcoiro", FALSE, "chunda", "guto"); g_assert_cmpstr(url, ==, "/arcoiro/chunda/guto/"); g_free(url); url = balde_app_url_for(app, request, "arcoiro2", FALSE, "bola"); g_assert_cmpstr(url, ==, "/arco/bola"); g_free(url); url = balde_app_url_for(app, request, "arcoiro2", FALSE, "bo\"la"); g_assert_cmpstr(url, ==, "/arco/bo%22la"); g_free(url); url = balde_app_url_for(app, request, "static", FALSE, "foo/jquery-min.js"); g_assert_cmpstr(url, ==, "/static/foo/jquery-min.js"); g_free(url); balde_request_free(request); balde_app_free(app); g_unsetenv("REQUEST_METHOD"); g_unsetenv("PATH_INFO"); }
void test_body(void) { set_headers(); balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app, NULL); g_assert_cmpstr(request->priv->body->str, ==, "guda=bola&moises=arcoiro"); g_assert_cmpint(request->priv->body->len, ==, 24); balde_request_free(request); balde_app_free(app); }
void test_request_get_cookie(void) { balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app); g_hash_table_replace(request->cookies, g_strdup("foo"), g_strdup("bar")); g_assert_cmpstr(balde_request_get_cookie(request, "foo"), == , "bar"); g_assert(balde_request_get_cookie(request, "xd") == NULL); balde_request_free(request); balde_app_free(app); }
void test_form(void) { set_headers(); balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app, NULL); g_assert(request->priv->form != NULL); g_assert(g_hash_table_size(request->priv->form) == 2); g_assert_cmpstr(g_hash_table_lookup(request->priv->form, "guda"), ==, "bola"); g_assert_cmpstr(g_hash_table_lookup(request->priv->form, "moises"), ==, "arcoiro"); balde_request_free(request); balde_app_free(app); }
void test_request_get_view_arg(void) { balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app); request->view_args = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(request->view_args, g_strdup("foo"), g_strdup("bar")); g_assert_cmpstr(balde_request_get_view_arg(request, "foo"), == , "bar"); g_assert(balde_request_get_view_arg(request, "xd") == NULL); balde_request_free(request); balde_app_free(app); }
void test_request_get_arg(void) { g_setenv("QUERY_STRING", "lol=hehe", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app); g_assert_cmpstr(balde_request_get_arg(request, "lol"), == , "hehe"); g_assert(balde_request_get_header(request, "xd") == NULL); balde_request_free(request); balde_app_free(app); }
void test_request_get_form(void) { g_setenv("REQUEST_METHOD", "GET", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app); g_assert(request->stream == NULL); g_assert(request->form == NULL); g_assert(balde_request_get_form(request, "lol") == NULL); balde_request_free(request); balde_app_free(app); }
void test_request_get_form_with_empty_body(void) { g_setenv("REQUEST_METHOD", "POST", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); // ommited CONTENT_LENGTH balde_request_t *request = balde_make_request(app); g_assert(request->stream == NULL); g_assert(g_hash_table_size(request->form) == 0); g_assert(balde_request_get_form(request, "lol") == NULL); balde_request_free(request); balde_app_free(app); }
void test_request_get_header(void) { g_setenv("HTTP_LOL_HEHE", "12345", TRUE); g_setenv("HTTP_XD_KKK", "asdf", TRUE); // FIXME: this thing is too weak :( balde_app_t *app = balde_app_init(); balde_request_t *request = balde_make_request(app); g_assert_cmpstr(balde_request_get_header(request, "Lol-Hehe"), ==, "12345"); g_assert_cmpstr(balde_request_get_header(request, "XD-KKK"), ==, "asdf"); g_assert(balde_request_get_header(request, "foo") == NULL); balde_request_free(request); balde_app_free(app); }
GString* balde_app_main_loop(balde_app_t *app, balde_request_env_t *env, balde_response_render_t render, balde_http_exception_code_t *status_code) { balde_request_t *request = NULL; balde_response_t *response = NULL; balde_response_t *error_response = NULL; gchar *endpoint = NULL; gboolean with_body = TRUE; GString *rv = NULL; // render startup error, if any if (app->error != NULL) { error_response = balde_make_response_from_exception(app->error); rv = render(error_response, with_body); if (status_code != NULL) *status_code = error_response->status_code; balde_response_free(error_response); // free env, because it should be free'd by main loop and will not be // used anymore. balde_request_env_free(env); return rv; } request = balde_make_request(app, env); with_body = ! (request->method & BALDE_HTTP_HEAD); for (GSList *tmp = app->priv->before_requests; tmp != NULL; tmp = g_slist_next(tmp)) { balde_before_request_t *hook = tmp->data; hook->before_request_func(app, request); if (app->error != NULL) { error_response = balde_make_response_from_exception(app->error); rv = render(error_response, with_body); if (status_code != NULL) *status_code = error_response->status_code; balde_response_free(error_response); g_clear_error(&app->error); return rv; } } balde_app_t *app_copy = balde_app_copy(app); // get the view endpoint = balde_dispatch_from_path(app_copy->priv->views, request->path, &(request->priv->view_args)); if (endpoint == NULL) { // no view found! :( balde_abort_set_error(app_copy, 404); } else { // validate http method balde_view_t *view = balde_app_get_view_from_endpoint(app_copy, endpoint); if (request->method & view->url_rule->method) { // answer OPTIONS automatically if (request->method == BALDE_HTTP_OPTIONS) { response = balde_make_response(""); gchar *allow = balde_list_allowed_methods(view->url_rule->method); balde_response_set_header(response, "Allow", allow); g_free(allow); } // run the view else { response = view->view_func(app_copy, request); } } // method not allowed else { balde_abort_set_error(app_copy, 405); } g_free(endpoint); } balde_request_free(request); if (app_copy->error != NULL) { error_response = balde_make_response_from_exception(app_copy->error); rv = render(error_response, with_body); if (status_code != NULL) *status_code = error_response->status_code; balde_response_free(response); balde_response_free(error_response); balde_app_free(app_copy); return rv; } rv = render(response, with_body); if (status_code != NULL) *status_code = response->status_code; balde_response_free(response); balde_app_free(app_copy); return rv; }