diff options
author | Aleksey Veresov <aleksey@veresov.pro> | 2019-10-11 14:35:34 +0300 |
---|---|---|
committer | Aleksey Veresov <aleksey@veresov.pro> | 2019-10-11 14:35:34 +0300 |
commit | b0a358a5f2ee27c052c163606a20135f37761884 (patch) | |
tree | 24e18faa3f7691407e5fc5265b5b9a9b340efa4d /examples | |
parent | 7290d88173184079d9e7a6aaf2cab27e1900831d (diff) | |
download | magi-b0a358a5f2ee27c052c163606a20135f37761884.tar magi-b0a358a5f2ee27c052c163606a20135f37761884.tar.xz magi-b0a358a5f2ee27c052c163606a20135f37761884.zip |
.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/append.c | 48 | ||||
-rw-r--r-- | examples/cookie.c | 58 | ||||
-rw-r--r-- | examples/makefile | 24 | ||||
-rw-r--r-- | examples/upload.c | 73 |
4 files changed, 203 insertions, 0 deletions
diff --git a/examples/append.c b/examples/append.c new file mode 100644 index 0000000..f0dfe2a --- /dev/null +++ b/examples/append.c @@ -0,0 +1,48 @@ +#include <stdio.h> +#include <stdlib.h> +#include <request.h> + + +void handle_request() +{ + struct magi_request request; + if (magi_request_build_cgi(&request, 0, 0)) { + struct magi_field *a = magi_field_list_get(request.fields, "addon"); + if (a && a->data) { + FILE *file = fopen("file_to_append", "a"); + fputs(a->data, file); + fclose(file); + } + magi_request_destroy(&request); + } +} + +void print_preamble() +{ + puts("Content-type: application/xhtml+xml\r\n\r\n"); +} + +void print_webpage() +{ + puts( + "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' " + "'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>" + "<html xmlns='http://www.w3.org/1999/xhtml'>" + "<head><title>Append to File</title></head>" + "<body>" + "<form action='/cgi-bin/append' method='GET'>" + "<input type='text' name='addon' value='Whatever you want to add.'/>" + "<input type='submit' value='Append'/>" + "</form>" + "</body>" + "</html>" + ); +} + +int main(int argc, char const *argv[]) +{ + handle_request(); + print_preamble(); + print_webpage(); + return 0; +} diff --git a/examples/cookie.c b/examples/cookie.c new file mode 100644 index 0000000..8f4018b --- /dev/null +++ b/examples/cookie.c @@ -0,0 +1,58 @@ +#include <cookie.h> +#include <stdio.h> +#include <stdlib.h> +#include <request.h> + + +void print_preamble() +{ + puts( + "Set-Cookie:cookie=monstre\r\n" /* Important to set cookies before: */ + "Content-Type: application/xhtml+xml\r\n\r\n" + ); +} + +void print_webpage_top() +{ + puts( + "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' " + "'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>" + "<html xmlns='http://www.w3.org/1999/xhtml'>" + "<head><title>Cookie Listing and Setting</title></head>" + "<body>" + ); +} + +void read_and_print_cookies() +{ + struct magi_request request; + if (magi_request_build_cgi(&request, 0, 0)) { + struct magi_cookie_list *cookie; + for (cookie = request.cookies; cookie; cookie = cookie->next) { + printf( + "[%s] = [%s]<br/>", + cookie->item.name, + cookie->item.data + ); + } + magi_request_destroy(&request); + } +} + +void print_webpage_bottom() +{ + puts( + "</body>" + "</html>" + ); +} + +int main(int argc, char const *argv[]) +{ + print_preamble(); + /* Following probably will be much more pleasant with use of templates. */ + print_webpage_top(); + read_and_print_cookies(); + print_webpage_bottom(); + return 0; +} diff --git a/examples/makefile b/examples/makefile new file mode 100644 index 0000000..de6b310 --- /dev/null +++ b/examples/makefile @@ -0,0 +1,24 @@ +# Uncomment following to enable debug mode: +# DEBUG = yes + +CC = gcc +EXAMPLES = append cookie upload + +CFLAGS = -xc -ansi -pedantic -Wall +ifeq '$(DEBUG)' 'yes' +CFLAGS += -g -O0 +else +CFLAGS += -O3 +endif + +INCLUDE = -I ../src +LFLAGS = -L.. -lmagi + + +default: $(EXAMPLES) + +%: %.c + $(CC) $(CFLAGS) $(INCLUDE) $< $(LFLAGS) -o $@ + +clean: + rm -f $(EXAMPLES) diff --git a/examples/upload.c b/examples/upload.c new file mode 100644 index 0000000..9dc1efd --- /dev/null +++ b/examples/upload.c @@ -0,0 +1,73 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <request.h> +#include <multipart.h> + +void tempfile_callback(struct magi_field *field, char *buffer, int len) +{ + static FILE *file = 0; + if (!strcmp(field->name, "data")) { + if (!file) { + remove(field->name); + file = fopen(field->name, "wb"); + } + if (len) { + fwrite(buffer, 1, len, file); + } + if (len < magi_parse_multipart_callback_size) { + fclose(file); + file = 0; + } + } else if (len) { + field->data = realloc(field->data, field->len + len + 1); + memcpy(field->data + field->len, buffer, len); + field->len += len; + field->data[field->len] = 0; + } +} + +void handle_request() +{ + struct magi_request request; + if (magi_request_build_cgi(&request, tempfile_callback, 0)) { + struct magi_field *name = magi_field_list_get(request.fields, "name"); + struct magi_field *data = magi_field_list_get(request.fields, "data"); + if (name && name->data && data) { + rename("data", name->data); + } + magi_request_destroy(&request); + } +} + +void print_preamble() +{ + puts("Content-type: application/xhtml+xml\r\n\r\n"); +} + +void print_webpage() +{ + puts( + "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' " + "'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>" + "<html xmlns='http://www.w3.org/1999/xhtml'>" + "<head><title>Upload File</title></head>" + "<body>" + "<form action='/cgi-bin/upload' method='POST' " + "enctype='multipart/form-data'>" + "<input type='text' name='name' value='filename'/>" + "<input type='file' name='data'/>" + "<input type='submit' value='Upload'/>" + "</form>" + "</body>" + "</html>" + ); +} + +int main(int argc, char const *argv[]) +{ + handle_request(); + print_preamble(); + print_webpage(); + return 0; +} |