From 7a8582faac8f5267eac1e834c13776568b5a8fab Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sun, 22 Sep 2024 14:26:07 +0900 Subject: [PATCH] Change template generation: output used filenames --- src/http.c | 3 ++- src/http_template.c | 17 +++++++++++++++- src/http_template.h | 16 ++++++++++----- src/test.c | 47 +++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 72 insertions(+), 11 deletions(-) diff --git a/src/http.c b/src/http.c index f79797d..08165db 100644 --- a/src/http.c +++ b/src/http.c @@ -162,7 +162,8 @@ char *c_simple_http_request_response( char *generated_buf = c_simple_http_path_to_generated( stripped_path ? stripped_path : request_path, templates, - &generated_size); + &generated_size, + NULL); // TODO Use the output parameter "filenames list" here. if (!generated_buf || generated_size == 0) { fprintf(stderr, "ERROR Unable to generate response html for path \"%s\"!\n", diff --git a/src/http_template.c b/src/http_template.c index 510ee8b..2a47a3d 100644 --- a/src/http_template.c +++ b/src/http_template.c @@ -96,10 +96,14 @@ int c_simple_http_internal_ends_with_FILE(const char *c_string) { char *c_simple_http_path_to_generated( const char *path, const C_SIMPLE_HTTP_HTTPTemplates *templates, - size_t *output_buf_size) { + size_t *output_buf_size, + SDArchiverLinkedList **files_list_out) { if (output_buf_size) { *output_buf_size = 0; } + if (files_list_out) { + *files_list_out = simple_archiver_list_init(); + } size_t path_len_size_t = strlen(path) + 1; if (path_len_size_t > 0xFFFFFFFF) { fprintf(stderr, "ERROR: Path string is too large!\n"); @@ -139,6 +143,11 @@ char *c_simple_http_path_to_generated( } html_buf[html_file_size] = 0; html_buf_size = (size_t)html_file_size; + if (files_list_out) { + char *html_filename_copy = malloc(strlen(html_filename) + 1); + strcpy(html_filename_copy, html_filename); + simple_archiver_list_add(*files_list_out, html_filename_copy, NULL); + } } else { char *stored_html = simple_archiver_hash_map_get(wrapped_hash_map->hash_map, "HTML", 5); @@ -258,6 +267,12 @@ char *c_simple_http_path_to_generated( value_c_str); return NULL; } + if (files_list_out) { + char *variable_filename = malloc(strlen(value_c_str) + 1); + strcpy(variable_filename, value_c_str); + simple_archiver_list_add( + *files_list_out, variable_filename, NULL); + } } else { // Variable data is "value_c_str". template_node = diff --git a/src/http_template.h b/src/http_template.h index ae4586b..8aa12ba 100644 --- a/src/http_template.h +++ b/src/http_template.h @@ -22,14 +22,20 @@ // Standard library includes. #include -// Returns non-NULL on success, which must be free'd after use. -// Takes a path string and templates and returns the generated HTML. -// If "output_buf_size" is non-NULL, it will be set to the size of the returned -// buffer. +// Third-party includes. +#include + +// Returns non-NULL on success, which must be free'd after use. Takes a path +// string and templates and returns the generated HTML. If "output_buf_size" is +// non-NULL, it will be set to the size of the returned buffer. If +// "files_list_out" is non-NULL, then the pointer will be set to a newly +// allocated linked-list containing filenames used in generating the HTML. This +// newly allocated linked-list must be freed after use. char *c_simple_http_path_to_generated( const char *path, const C_SIMPLE_HTTP_HTTPTemplates *templates, - size_t *output_buf_size); + size_t *output_buf_size, + SDArchiverLinkedList **files_list_out); #endif diff --git a/src/test.c b/src/test.c index 66c4d0e..241b62e 100644 --- a/src/test.c +++ b/src/test.c @@ -5,6 +5,7 @@ #include // Local includes. +#include "SimpleArchiver/src/data_structures/linked_list.h" #include "config.h" #include "http_template.h" #include "http.h" @@ -89,6 +90,15 @@ void test_internal_cleanup_delete_temporary_file(const char **filename) { } } +int test_internal_check_matching_string_in_list(void *value, void *ud) { + if (value && ud) { + if (strcmp(value, ud) == 0) { + return 1; + } + } + return 0; +} + int main(void) { // Test config. { @@ -252,12 +262,18 @@ int main(void) { size_t output_buf_size; + __attribute__((cleanup(simple_archiver_list_free))) + SDArchiverLinkedList *filenames_list = NULL; + __attribute__((cleanup(simple_archiver_helper_cleanup_c_string))) - char *buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); + char *buf = c_simple_http_path_to_generated( + "/", &config, &output_buf_size, &filenames_list); ASSERT_TRUE(buf != NULL); ASSERT_TRUE(strcmp(buf, "

Test

") == 0); CHECK_TRUE(output_buf_size == 13); + CHECK_TRUE(filenames_list->count == 0); simple_archiver_helper_cleanup_c_string(&buf); + simple_archiver_list_free(&filenames_list); __attribute__((cleanup(test_internal_cleanup_delete_temporary_file))) const char *test_http_template_filename2 = @@ -288,7 +304,8 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); - buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); + buf = c_simple_http_path_to_generated( + "/", &config, &output_buf_size, &filenames_list); ASSERT_TRUE(buf != NULL); printf("%s\n", buf); ASSERT_TRUE( @@ -297,7 +314,9 @@ int main(void) { "

Some text.


More text.

") == 0); CHECK_TRUE(output_buf_size == 46); + CHECK_TRUE(filenames_list->count == 0); simple_archiver_helper_cleanup_c_string(&buf); + simple_archiver_list_free(&filenames_list); __attribute__((cleanup(test_internal_cleanup_delete_temporary_file))) const char *test_http_template_filename3 = @@ -351,7 +370,8 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); - buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); + buf = c_simple_http_path_to_generated( + "/", &config, &output_buf_size, &filenames_list); ASSERT_TRUE(buf != NULL); printf("%s\n", buf); ASSERT_TRUE( @@ -360,7 +380,14 @@ int main(void) { "

testVar text.


testVar2 text.

") == 0); CHECK_TRUE(output_buf_size == 53); + CHECK_TRUE(filenames_list->count == 1); + CHECK_TRUE(simple_archiver_list_get( + filenames_list, + test_internal_check_matching_string_in_list, + (void*)test_http_template_html_filename) + != NULL); simple_archiver_helper_cleanup_c_string(&buf); + simple_archiver_list_free(&filenames_list); __attribute__((cleanup(test_internal_cleanup_delete_temporary_file))) const char *test_http_template_filename4 = @@ -434,7 +461,8 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); - buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); + buf = c_simple_http_path_to_generated( + "/", &config, &output_buf_size, &filenames_list); ASSERT_TRUE(buf != NULL); printf("%s\n", buf); ASSERT_TRUE( @@ -443,6 +471,17 @@ int main(void) { "

some test text in test var file.

") == 0); CHECK_TRUE(output_buf_size == 43); + CHECK_TRUE(filenames_list->count == 2); + CHECK_TRUE(simple_archiver_list_get( + filenames_list, + test_internal_check_matching_string_in_list, + (void*)test_http_template_html_filename2) + != NULL); + CHECK_TRUE(simple_archiver_list_get( + filenames_list, + test_internal_check_matching_string_in_list, + (void*)test_http_template_html_var_filename) + != NULL); simple_archiver_helper_cleanup_c_string(&buf); }