Compare commits

..

2 commits

Author SHA1 Message Date
676b98751d Remove temporary files created by unit test on end
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 33s
2024-09-05 14:07:42 +09:00
229e3a330f Impl. ".*_FILE" variables for templates
If there exists a "{{{something_FILE}}}" (a variable ending with
"_FILE"), then the loaded variable will be treated as a filename and its
contents will be put in the html template.
2024-09-05 14:02:25 +09:00
2 changed files with 166 additions and 10 deletions

View file

@ -76,6 +76,26 @@ int c_simple_http_internal_fill_buf_fn(void *data, void *ud) {
return 0; return 0;
} }
/// Returns 0 if "c_string" ends with "_FILE".
int c_simple_http_internal_ends_with_FILE(const char *c_string) {
if (!c_string) {
return 1;
}
const char *comparison_string = "_FILE";
const size_t c_string_size = strlen(c_string);
if (strcmp(
comparison_string,
c_string + (c_string_size - strlen(comparison_string)))
== 0) {
return 0;
}
return 2;
}
char *c_simple_http_path_to_generated( char *c_simple_http_path_to_generated(
const char *path, const char *path,
const C_SIMPLE_HTTP_HTTPTemplates *templates) { const C_SIMPLE_HTTP_HTTPTemplates *templates) {
@ -192,9 +212,49 @@ char *c_simple_http_path_to_generated(
wrapped_hash_map->hash_map, wrapped_hash_map->hash_map,
var, var,
var_size + 1); var_size + 1);
// TODO Impl. loading from file instead of directly from value.
// Perhaps do this if "var" ends with "_FILE".
if (value_c_str) { if (value_c_str) {
if (c_simple_http_internal_ends_with_FILE(var) == 0) {
// Load from file specified by "value_c_str".
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
FILE *f = fopen(value_c_str, "r");
if (!f) {
fprintf(stderr, "ERROR Failed to open file \"%s\"!\n",
value_c_str);
return NULL;
} else if (fseek(f, 0, SEEK_END) != 0) {
fprintf(stderr, "ERROR Failed to seek to end of file \"%s\"!\n",
value_c_str);
return NULL;
}
long file_size = ftell(f);
if (file_size <= 0) {
fprintf(stderr, "ERROR Size of file \"%s\" is invalid!\n",
value_c_str);
return NULL;
} else if (fseek(f, 0, SEEK_SET) != 0) {
fprintf(stderr, "ERROR Failed to seek to start of file "
"\"%s\"!\n",
value_c_str);
return NULL;
}
template_node =
malloc(sizeof(C_SIMPLE_HTTP_INTERNAL_Template_Node));
template_node->html_size = (size_t)file_size;
template_node->html = malloc(template_node->html_size);
template_node->orig_end_idx = idx + 1;
template_node->forced_next = NULL;
if (fread(template_node->html,
template_node->html_size,
1,
f)
!= 1) {
fprintf(stderr, "ERROR Failed to read from file \"%s\"!\n",
value_c_str);
return NULL;
}
} else {
// Variable data is "value_c_str".
template_node = template_node =
malloc(sizeof(C_SIMPLE_HTTP_INTERNAL_Template_Node)); malloc(sizeof(C_SIMPLE_HTTP_INTERNAL_Template_Node));
size_t size = strlen(value_c_str); size_t size = strlen(value_c_str);
@ -203,6 +263,7 @@ char *c_simple_http_path_to_generated(
template_node->html_size = size; template_node->html_size = size;
template_node->orig_end_idx = idx + 1; template_node->orig_end_idx = idx + 1;
template_node->forced_next = NULL; template_node->forced_next = NULL;
}
} else { } else {
template_node = template_node =
malloc(sizeof(C_SIMPLE_HTTP_INTERNAL_Template_Node)); malloc(sizeof(C_SIMPLE_HTTP_INTERNAL_Template_Node));

View file

@ -79,9 +79,18 @@ static int checks_passed = 0;
} \ } \
} while (0); } while (0);
void test_internal_cleanup_delete_temporary_file(const char **filename) {
if (filename && *filename) {
if (remove(*filename) != 0) {
fprintf(stderr, "ERROR Failed to remove file \"%s\"!\n", *filename);
}
}
}
int main(void) { int main(void) {
// Test config. // Test config.
{ {
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_config_filename = "/tmp/c_simple_http_test.config"; const char *test_config_filename = "/tmp/c_simple_http_test.config";
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE))) __attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
FILE *test_file = fopen(test_config_filename, "w"); FILE *test_file = fopen(test_config_filename, "w");
@ -211,6 +220,7 @@ int main(void) {
// Test http_template. // Test http_template.
{ {
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_filename = const char *test_http_template_filename =
"/tmp/c_simple_http_template_test.config"; "/tmp/c_simple_http_template_test.config";
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE))) __attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
@ -244,6 +254,7 @@ int main(void) {
ASSERT_TRUE(strcmp(buf, "<h1>Test</h1>") == 0); ASSERT_TRUE(strcmp(buf, "<h1>Test</h1>") == 0);
simple_archiver_helper_cleanup_c_string(&buf); simple_archiver_helper_cleanup_c_string(&buf);
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_filename2 = const char *test_http_template_filename2 =
"/tmp/c_simple_http_template_test2.config"; "/tmp/c_simple_http_template_test2.config";
test_file = fopen(test_http_template_filename2, "w"); test_file = fopen(test_http_template_filename2, "w");
@ -282,8 +293,10 @@ int main(void) {
== 0); == 0);
simple_archiver_helper_cleanup_c_string(&buf); simple_archiver_helper_cleanup_c_string(&buf);
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_filename3 = const char *test_http_template_filename3 =
"/tmp/c_simple_http_template_test3.config"; "/tmp/c_simple_http_template_test3.config";
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_html_filename = const char *test_http_template_html_filename =
"/tmp/c_simple_http_template_test.html"; "/tmp/c_simple_http_template_test.html";
test_file = fopen(test_http_template_filename3, "w"); test_file = fopen(test_http_template_filename3, "w");
@ -341,6 +354,88 @@ int main(void) {
"<h1> testVar text. </h1><br><h2> testVar2 text. </h2>") "<h1> testVar text. </h1><br><h2> testVar2 text. </h2>")
== 0); == 0);
simple_archiver_helper_cleanup_c_string(&buf); simple_archiver_helper_cleanup_c_string(&buf);
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_filename4 =
"/tmp/c_simple_http_template_test4.config";
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_html_filename2 =
"/tmp/c_simple_http_template_test2.html";
__attribute__((cleanup(test_internal_cleanup_delete_temporary_file)))
const char *test_http_template_html_var_filename =
"/tmp/c_simple_http_template_test_var.html";
test_file = fopen(test_http_template_filename4, "w");
ASSERT_TRUE(test_file);
ASSERT_TRUE(
fwrite(
"PATH=/\nHTML_FILE=/tmp/c_simple_http_template_test2.html\n",
1,
56,
test_file)
== 56);
ASSERT_TRUE(
fwrite(
"testVar_FILE=/tmp/c_simple_http_template_test_var.html\n",
1,
55,
test_file)
== 55);
simple_archiver_helper_cleanup_FILE(&test_file);
test_file = fopen(test_http_template_html_filename2, "w");
ASSERT_TRUE(test_file);
ASSERT_TRUE(
fwrite(
"<h1>{{{testVar_FILE}}}</h1>",
1,
27,
test_file)
== 27);
simple_archiver_helper_cleanup_FILE(&test_file);
test_file = fopen(test_http_template_html_var_filename, "w");
ASSERT_TRUE(test_file);
ASSERT_TRUE(
fwrite(
" some test text in test var file. ",
1,
34,
test_file)
== 34);
simple_archiver_helper_cleanup_FILE(&test_file);
simple_archiver_list_free(&required_names);
required_names = simple_archiver_list_init();
simple_archiver_list_add(
required_names,
"HTML_FILE",
simple_archiver_helper_datastructure_cleanup_nop);
simple_archiver_list_add(
required_names,
"testVar_FILE",
simple_archiver_helper_datastructure_cleanup_nop);
c_simple_http_clean_up_parsed_config(&config);
config = c_simple_http_parse_config(
test_http_template_filename4,
"PATH",
required_names
);
ASSERT_TRUE(config.paths != NULL);
buf = c_simple_http_path_to_generated("/", &config);
ASSERT_TRUE(buf != NULL);
printf("%s\n", buf);
ASSERT_TRUE(
strcmp(
buf,
"<h1> some test text in test var file. </h1>")
== 0);
simple_archiver_helper_cleanup_c_string(&buf);
} }
RETURN() RETURN()