aboutsummaryrefslogtreecommitdiff
path: root/examples/lang.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2023-12-06 19:54:42 +0300
committerAleksey Veresov <aleksey@veresov.pro>2023-12-06 19:54:42 +0300
commit9c5e4f5d0a736574bc09bb0817becde62eb56e00 (patch)
tree459e00a23281ecaacb4ebffe8186faebd1fb87db /examples/lang.c
parent41af7aebf4cd86bacee211aa0a5dbba3196f6fdc (diff)
downloadmagi-master.tar
magi-master.tar.xz
magi-master.zip
Add more practical examplesHEADmaster
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.c69
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;
+}