Mercurial > paster
diff http.c @ 25:f4e8a7920b94
pasterd: implement search, closes #2474 @30m
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 07 Feb 2020 13:23:48 +0100 |
parents | 8d274b012d28 |
children | 48834441dc86 |
line wrap: on
line diff
--- a/http.c Thu Feb 06 21:48:32 2020 +0100 +++ b/http.c Fri Feb 07 13:23:48 2020 +0100 @@ -43,6 +43,7 @@ static void page_fork(struct kreq *); static void page_paste(struct kreq *); static void page_download(struct kreq *); +static void page_search(struct kreq *); static void page_static(struct kreq *); enum page { @@ -51,6 +52,7 @@ PAGE_FORK, PAGE_PASTE, PAGE_DOWNLOAD, + PAGE_SEARCH, PAGE_STATIC, PAGE_LAST /* Not used. */ }; @@ -61,6 +63,7 @@ [PAGE_FORK] = "fork", [PAGE_PASTE] = "paste", [PAGE_DOWNLOAD] = "download", + [PAGE_SEARCH] = "search", [PAGE_STATIC] = "static" }; @@ -70,6 +73,7 @@ [PAGE_FORK] = page_fork, [PAGE_PASTE] = page_paste, [PAGE_DOWNLOAD] = page_download, + [PAGE_SEARCH] = page_search, [PAGE_STATIC] = page_static }; @@ -789,6 +793,88 @@ } static void +page_search_get(struct kreq *req) +{ + /* We re-use the /new form with an empty paste. */ + struct tmpl_paste data = { + .req = req + }; + const struct ktemplate kt = { + .key = tmpl_new_keywords, + .keysz = 6, + .cb = tmpl_new, + .arg = &data + }; + + page(req, &kt, KHTTP_200, "search.html"); +} + +static void +page_search_post(struct kreq *req) +{ + struct tmpl_index data = { + .req = req, + .count = 10 + }; + + const char *title = NULL; + const char *author = NULL; + const char *language = NULL; + + for (size_t i = 0; i < req->fieldsz; ++i) { + const char *key = req->fields[i].key; + const char *val = req->fields[i].val; + + if (strcmp(key, "title") == 0) + title = val; + else if (strcmp(key, "author") == 0) + author = val; + else if (strcmp(key, "language") == 0) + language = val; + } + + /* Sets to null if they are empty. */ + if (title && strlen(title) == 0) + title = NULL; + if (author && strlen(author) == 0) + author = NULL; + if (language && strlen(language) == 0) + language = NULL; + + if (!database_search(data.pastes, &data.count, title, author, language)) + page(req, NULL, KHTTP_500, "500.html"); + else { + struct ktemplate kt = { + .key = tmpl_index_keywords, + .keysz = 1, + .arg = &data, + .cb = tmpl_index + }; + + page(req, &kt, KHTTP_200, "index.html"); + } + + for (size_t i = 0; i < data.count; ++i) + paste_finish(&data.pastes[i]); +} + +static void +page_search(struct kreq *req) +{ + switch (req->method) { + case KMETHOD_GET: + page_search_get(req); + break; + case KMETHOD_POST: + page_search_post(req); + break; + default: + page(req, NULL, KHTTP_400, "400.html"); + break; + } +} + +static void page_static_get(struct kreq *req) { struct stat st;