From 9c5e4f5d0a736574bc09bb0817becde62eb56e00 Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Wed, 6 Dec 2023 19:54:42 +0300 Subject: Add more practical examples lang.c example automatically redirects to a particular website version, based on the language prefernces of the user. style.c cycles through a range of CSS styles. --- examples/lang.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 examples/lang.c (limited to 'examples/lang.c') diff --git a/examples/lang.c b/examples/lang.c new file mode 100644 index 0000000..eb6336e --- /dev/null +++ b/examples/lang.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include + + +static char *scat(const char *a, const char *b) +{ + int alen = a ? strlen(a) : 0; + int blen = b ? strlen(b) : 0; + char *res = malloc(alen + blen + 1); + memcpy(res, a, alen); + memcpy(res + alen, b, blen); + res[alen + blen] = 0; + return res; +} + + +static const char *determ(const char *langprefs) +{ + int i; + const char *langs[] = { "en", "ru" }; + const int langslen = 2; + const char *min = 0; + int minid = 0; + for (i = 0; i != langslen; ++i) { + const char *res = strstr(langprefs, langs[i]); + if (min == 0 || res < min) { + min = res; + minid = i; + } + } + return langs[minid]; +} + +static void response(struct magi_request *req) +{ + struct magi_response res; + const char *lang = getenv("HTTP_ACCEPT_LANGUAGE"); + char *a = scat(req->script, req->path); + char *b = scat(determ(lang), a); + free(a); + a = scat("/", b); + free(b); + b = scat(req->host, a); + free(a); + a = scat("https://", b); + free(b); + magi_response_init(&res); + magi_response_status(&res, 302, "Moved Temporarily"); + magi_response_header(&res, "Location", a); + free(a); + magi_response_send(&res); + magi_response_free(&res); +} + + +int main() +{ + struct magi_request request; + magi_request_init(&request); + if (magi_parse(&request)) { + response(&request); + } else { + magi_error_response(request.error); + } + magi_request_free(&request); + return 0; +} -- cgit v1.2.3