diff options
author | Aleksey Veresov <aleksey@veresov.pro> | 2023-12-06 19:54:42 +0300 |
---|---|---|
committer | Aleksey Veresov <aleksey@veresov.pro> | 2023-12-06 19:54:42 +0300 |
commit | 9c5e4f5d0a736574bc09bb0817becde62eb56e00 (patch) | |
tree | 459e00a23281ecaacb4ebffe8186faebd1fb87db /examples/lang.c | |
parent | 41af7aebf4cd86bacee211aa0a5dbba3196f6fdc (diff) | |
download | magi-master.tar magi-master.tar.xz magi-master.zip |
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.
Diffstat (limited to 'examples/lang.c')
-rw-r--r-- | examples/lang.c | 69 |
1 files changed, 69 insertions, 0 deletions
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 <magi.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +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; +} |