]> saetta.ns0.it Git - libzakcgi/commitdiff
Enabled caching operations.
authorAndrea Zagli <azagli@libero.it>
Tue, 7 Jul 2015 16:06:59 +0000 (18:06 +0200)
committerAndrea Zagli <azagli@libero.it>
Tue, 7 Jul 2015 16:06:59 +0000 (18:06 +0200)
13 files changed:
libzakcgi.pc.in
src/main.c
src/main.h
src/session.c
src/session.h
src/url.c
src/url.h
tests/cookies.c
tests/env.c
tests/querystring.c
tests/redirect.c
tests/session.c
tests/url.c

index edc6b1c957df74fcfc846b6ab6b77db10803832d..ae02418588d71fbfead058850cfb43c30f3e5aee 100644 (file)
@@ -6,6 +6,6 @@ includedir=@includedir@
 Name: @PACKAGE_NAME@
 Description: Class for CGI.
 Version: @PACKAGE_VERSION@
-Requires: glib-2.0 >= 2.36
+Requires: glib-2.0 >= 2.36 gobject gio gio-unix
 Libs: -L${libdir} -lzakcgi
 Cflags: -I${includedir}
index a0ed5d5c58eb1edb7e9207103d203a3292d4a76d..6451161f6545b7d9174044ca42a44a4a83ae1d61 100644 (file)
@@ -50,6 +50,10 @@ static void zak_cgi_main_finalize (GObject *gobject);
 typedef struct _ZakCgiMainPrivate ZakCgiMainPrivate;
 struct _ZakCgiMainPrivate
        {
+               GHashTable *ht_env;
+               GHashTable *ht_cookies;
+               GHashTable *ht_parameters;
+               gchar *stdin;
        };
 
 G_DEFINE_TYPE (ZakCgiMain, zak_cgi_main, G_TYPE_OBJECT)
@@ -72,6 +76,10 @@ zak_cgi_main_init (ZakCgiMain *zak_cgi_main)
 {
        ZakCgiMainPrivate *priv = ZAK_CGI_MAIN_GET_PRIVATE (zak_cgi_main);
 
+       priv->ht_env = NULL;
+       priv->ht_cookies = NULL;
+       priv->ht_parameters = NULL;
+       priv->stdin = NULL;
 }
 
 /**
@@ -89,7 +97,6 @@ ZakCgiMain
 
        priv = ZAK_CGI_MAIN_GET_PRIVATE (zak_cgi_main);
 
-
        return zak_cgi_main;
 }
 
@@ -122,12 +129,14 @@ zak_cgi_main_out (const gchar *header, const gchar *body)
 
 /**
  * zak_cgi_main_get_env:
+ * @zakcgimain:
  *
  * Returns: a #GHashTable with all the environment variables.
  */
 GHashTable
-*zak_cgi_main_get_env (void)
+*zak_cgi_main_get_env (ZakCgiMain *zakcgimain)
 {
+       ZakCgiMainPrivate *priv;
        GHashTable *ht;
 
        gchar **environ;
@@ -135,7 +144,20 @@ GHashTable
        guint i;
        gchar **envs;
 
+       if (zakcgimain != NULL)
+               {
+                       priv = ZAK_CGI_MAIN_GET_PRIVATE (zakcgimain);
+                       if (priv->ht_env != NULL)
+                               {
+                                       return g_hash_table_ref (priv->ht_env);
+                               }
+               }
+       
        ht = g_hash_table_new (g_str_hash, g_str_equal);
+       if (zakcgimain != NULL)
+               {
+                       priv->ht_env = g_hash_table_ref (ht);
+               }
 
        environ = g_get_environ ();
        l = g_strv_length (environ);
@@ -151,11 +173,12 @@ GHashTable
 
 /**
  * zak_cgi_main_dump_env:
+ * @zakcgimain:
  *
  * Returns: an html table with each environment variables.
  */
 gchar
-*zak_cgi_main_dump_env (void)
+*zak_cgi_main_dump_env (ZakCgiMain *zakcgimain)
 {
        GHashTable *ht_env;
        GHashTableIter iter;
@@ -166,7 +189,7 @@ gchar
        gpointer key;
        gpointer value;
 
-       ht_env = zak_cgi_main_get_env ();
+       ht_env = zak_cgi_main_get_env (zakcgimain);
 
        str = g_string_new ("");
 
@@ -192,12 +215,14 @@ gchar
 
 /**
  * zak_cgi_main_get_cookies:
+ * @zakcgimain:
  *
  * Returns: a #GHashTable with all the cookies.
  */
 GHashTable
-*zak_cgi_main_get_cookies (void)
+*zak_cgi_main_get_cookies (ZakCgiMain *zakcgimain)
 {
+       ZakCgiMainPrivate *priv;
        GHashTable *ht;
        GHashTable *ht_env;
 
@@ -207,9 +232,21 @@ GHashTable
        gchar **strv_cookies;
        gchar **parts;
 
+       if (zakcgimain != NULL)
+               {
+                       priv = ZAK_CGI_MAIN_GET_PRIVATE (zakcgimain);
+                       if (priv->ht_cookies != NULL)
+                               {
+                                       return g_hash_table_ref (priv->ht_cookies);
+                               }                       
+               }
        ht = g_hash_table_new (g_str_hash, g_str_equal);
+       if (zakcgimain != NULL)
+               {
+                       priv->ht_cookies = g_hash_table_ref (ht);
+               }
 
-       ht_env = zak_cgi_main_get_env ();
+       ht_env = zak_cgi_main_get_env (zakcgimain);
 
        cookies = g_hash_table_lookup (ht_env, "HTTP_COOKIE");
        if (cookies != NULL)
@@ -229,11 +266,12 @@ GHashTable
 
 /**
  * zak_cgi_main_dump_cookies:
+ * @zakcgimain:
  *
  * Returns: an html table with each cookies.
  */
 gchar
-*zak_cgi_main_dump_cookies (void)
+*zak_cgi_main_dump_cookies (ZakCgiMain *zakcgimain)
 {
        GHashTable *ht_env;
        GHashTableIter iter;
@@ -244,7 +282,7 @@ gchar
        gpointer key;
        gpointer value;
 
-       ht_env = zak_cgi_main_get_cookies ();
+       ht_env = zak_cgi_main_get_cookies (zakcgimain);
 
        str = g_string_new ("");
 
@@ -312,13 +350,15 @@ gchar
 
 /**
  * zak_cgi_main_get_parameters:
+ * @zakcgimain:
  * @query_string:
  *
  * Returns:
  */
 GHashTable
-*zak_cgi_main_get_parameters (const gchar *query_string)
+*zak_cgi_main_get_parameters (ZakCgiMain *zakcgimain, const gchar *query_string)
 {
+       ZakCgiMainPrivate *priv;
        GHashTable *ht;
 
        const gchar *qstring;
@@ -330,7 +370,25 @@ GHashTable
 
        GValue *gval;
 
-       ht = g_hash_table_new (g_str_hash, g_str_equal);
+       ht = NULL;
+       
+       if (zakcgimain != NULL)
+               {
+                       priv = ZAK_CGI_MAIN_GET_PRIVATE (zakcgimain);
+                       if (priv->ht_parameters != NULL)
+                               {
+                                       ht = g_hash_table_ref (priv->ht_parameters);
+                               }                       
+               }
+
+       if (ht == NULL)
+               {
+                       ht = g_hash_table_new (g_str_hash, g_str_equal);
+                       if (zakcgimain != NULL)
+                               {
+                                       priv->ht_parameters = g_hash_table_ref (ht);
+                               }
+               }
 
        if (query_string == NULL)
                {
@@ -360,14 +418,17 @@ GHashTable
 
 /**
  * zak_cgi_main_get_stdin:
+ * @zakcgimain:
  *
  * Returns: the stdin.
  */
 gchar
-*zak_cgi_main_get_stdin (void)
+*zak_cgi_main_get_stdin (ZakCgiMain *zakcgimain)
 {
        gchar *ret;
 
+       ZakCgiMainPrivate *priv;
+       
        const gchar *env;
        guint l;
        gsize bytesread;
@@ -376,6 +437,14 @@ gchar
        GInputStream *istream;
 
        ret = NULL;
+       if (zakcgimain != NULL)
+               {
+                       priv = ZAK_CGI_MAIN_GET_PRIVATE (zakcgimain);
+                       if (priv->stdin != NULL)
+                               {
+                                       return g_strdup (priv->stdin);
+                               }
+               }
 
        env = g_getenv ("CONTENT_LENGTH");
        if (env != NULL)
@@ -405,6 +474,11 @@ gchar
                                }
                }
 
+       if (zakcgimain != NULL)
+               {
+                       priv->stdin = g_strdup (ret);
+               }
+       
        return ret;
 }
 
@@ -489,7 +563,7 @@ GHashTable
        if (g_strcmp0 (content_type, "") == 0
                || g_strcmp0 (splitted[0], "application/x-www-form-urlencoded") == 0)
                {
-                       return zak_cgi_main_get_parameters (buf);
+                       return zak_cgi_main_get_parameters (NULL, buf);
                }
        else if (g_strcmp0 (splitted[0], "multipart/form-data") == 0)
                {
@@ -716,6 +790,22 @@ zak_cgi_main_finalize (GObject *gobject)
        ZakCgiMain *zak_cgi_main = (ZakCgiMain *)gobject;
        ZakCgiMainPrivate *priv = ZAK_CGI_MAIN_GET_PRIVATE (zak_cgi_main);
 
+       if (priv->ht_env != NULL)
+               {
+                       g_hash_table_destroy (priv->ht_env);
+               }
+       if (priv->ht_cookies != NULL)
+               {
+                       g_hash_table_destroy (priv->ht_cookies);
+               }
+       if (priv->ht_parameters != NULL)
+               {
+                       g_hash_table_destroy (priv->ht_parameters);
+               }
+       if (priv->stdin != NULL)
+               {
+                       g_free (priv->stdin);
+               }
 
        GObjectClass *parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (gobject));
        parent_class->finalize (gobject);
index c262210edd089fb756bdc09b2f14ec9d5399b164..aa608f7a8fb1c9e2512304896f161f0fe5869609 100644 (file)
@@ -56,11 +56,11 @@ ZakCgiMain *zak_cgi_main_new (void);
 
 void zak_cgi_main_out (const gchar *header, const gchar *body);
 
-GHashTable *zak_cgi_main_get_env (void);
-gchar *zak_cgi_main_dump_env (void);
+GHashTable *zak_cgi_main_get_env (ZakCgiMain *zakcgimain);
+gchar *zak_cgi_main_dump_env (ZakCgiMain *zakcgimain);
 
-GHashTable *zak_cgi_main_get_cookies (void);
-gchar *zak_cgi_main_dump_cookies (void);
+GHashTable *zak_cgi_main_get_cookies (ZakCgiMain *zakcgimain);
+gchar *zak_cgi_main_dump_cookies (ZakCgiMain *zakcgimain);
 
 gchar *zak_cgi_main_set_cookie (const gchar *name,
                                 const gchar *value,
@@ -70,9 +70,9 @@ gchar *zak_cgi_main_set_cookie (const gchar *name,
                                 gboolean secure,
                                 gboolean http_only);
 
-GHashTable *zak_cgi_main_get_parameters (const gchar *query_string);
+GHashTable *zak_cgi_main_get_parameters (ZakCgiMain *zakcgimain, const gchar *query_string);
 
-gchar *zak_cgi_main_get_stdin (void);
+gchar *zak_cgi_main_get_stdin (ZakCgiMain *zakcgimain);
 
 GHashTable *zak_cgi_main_parse_stdin (const gchar *buf, const gchar *boundary);
 
index e0a617e3b981bbcfa8a224c740a92394f526b493..8567c1b71a7ea13a88585a146d73bcbecbeb05a1 100644 (file)
@@ -24,7 +24,6 @@
 
 #include <string.h>
 
-#include "main.h"
 #include "session.h"
 
 static void zak_cgi_session_class_init (ZakCgiSessionClass *class);
@@ -47,6 +46,7 @@ static void zak_cgi_session_finalize (GObject *gobject);
 typedef struct _ZakCgiSessionPrivate ZakCgiSessionPrivate;
 struct _ZakCgiSessionPrivate
        {
+               ZakCgiMain *zakcgimain;
                gchar *sid;
                GFile *gfile;
                GKeyFile *kfile;
@@ -72,15 +72,17 @@ zak_cgi_session_init (ZakCgiSession *zak_cgi_session)
 {
        ZakCgiSessionPrivate *priv = ZAK_CGI_SESSION_GET_PRIVATE (zak_cgi_session);
 
+       priv->zakcgimain;
 }
 
 /**
  * zak_cgi_session_new:
+ * @zakcgimain:
  *
  * Returns: the newly created #ZakCgiSession object.
  */
 ZakCgiSession
-*zak_cgi_session_new (void)
+*zak_cgi_session_new (ZakCgiMain *zakcgimain)
 {
        GHashTable *ht_cookies;
 
@@ -92,8 +94,9 @@ ZakCgiSession
        zak_cgi_session = ZAK_CGI_SESSION (g_object_new (zak_cgi_session_get_type (), NULL));
 
        priv = ZAK_CGI_SESSION_GET_PRIVATE (zak_cgi_session);
+       priv->zakcgimain = zakcgimain;
 
-       ht_cookies = zak_cgi_main_get_cookies ();
+       ht_cookies = zak_cgi_main_get_cookies (priv->zakcgimain);
        priv->sid = g_hash_table_lookup (ht_cookies, "ZAKCGISID");
 
        if (priv->sid != NULL)
index 024fd55c10bc3ce50a736a14c73881d5a73466f0..f6f1839022fb1c8d6989c4a46b5d342ba0d869c9 100644 (file)
@@ -22,6 +22,8 @@
 
 #include <glib-object.h>
 
+#include "main.h"
+
 
 G_BEGIN_DECLS
 
@@ -49,7 +51,7 @@ struct _ZakCgiSessionClass
 GType zak_cgi_session_get_type (void);
 
 
-ZakCgiSession *zak_cgi_session_new (void);
+ZakCgiSession *zak_cgi_session_new (ZakCgiMain *zakcgimain);
 
 gchar *zak_cgi_session_get_header (ZakCgiSession *session);
 
index ed790529bc362152574025b02730cb5462b10007..8f5f06ad256f4f2d6d5a25783548648fa90c740c 100644 (file)
--- a/src/url.c
+++ b/src/url.c
@@ -22,7 +22,6 @@
 
 #include <syslog.h>
 
-#include "main.h"
 #include "url.h"
 
 static void zak_cgi_url_class_init (ZakCgiUrlClass *class);
@@ -45,6 +44,8 @@ static void zak_cgi_url_finalize (GObject *gobject);
 typedef struct _ZakCgiUrlPrivate ZakCgiUrlPrivate;
 struct _ZakCgiUrlPrivate
        {
+               ZakCgiMain *zakcgimain;
+               
                gchar *controller;
                gchar *action;
 
@@ -71,6 +72,8 @@ zak_cgi_url_init (ZakCgiUrl *zak_cgi_url)
 {
        ZakCgiUrlPrivate *priv = ZAK_CGI_URL_GET_PRIVATE (zak_cgi_url);
 
+       priv->zakcgimain = NULL;
+       
        priv->controller = NULL;
        priv->action = NULL;
 
@@ -79,11 +82,12 @@ zak_cgi_url_init (ZakCgiUrl *zak_cgi_url)
 
 /**
  * zak_cgi_url_new:
+ * @zakcgimain:
  *
  * Returns: the newly created #ZakCgiUrl object.
  */
 ZakCgiUrl
-*zak_cgi_url_new (void)
+*zak_cgi_url_new (ZakCgiMain *zakcgimain)
 {
        ZakCgiUrl *zak_cgi_url;
        ZakCgiUrlPrivate *priv;
@@ -95,9 +99,10 @@ ZakCgiUrl
        zak_cgi_url = ZAK_CGI_URL (g_object_new (zak_cgi_url_get_type (), NULL));
 
        priv = ZAK_CGI_URL_GET_PRIVATE (zak_cgi_url);
+       priv->zakcgimain = zakcgimain;
 
        /* parsing */
-       ht_env = zak_cgi_main_get_parameters (NULL);
+       ht_env = zak_cgi_main_get_parameters (priv->zakcgimain, NULL);
        url = g_hash_table_lookup (ht_env, "_url");
        if (url != NULL)
                {
index 5e536019e78ae9fbfcbe28514b5de442a9888487..53571e3018e35814f0ec2bcb3c7816337fda7dca 100644 (file)
--- a/src/url.h
+++ b/src/url.h
@@ -22,6 +22,8 @@
 
 #include <glib-object.h>
 
+#include "main.h"
+
 
 G_BEGIN_DECLS
 
@@ -49,7 +51,7 @@ struct _ZakCgiUrlClass
 GType zak_cgi_url_get_type (void);
 
 
-ZakCgiUrl *zak_cgi_url_new (void);
+ZakCgiUrl *zak_cgi_url_new (ZakCgiMain *zakcgimain);
 
 typedef void (*ZakCgiUrlConnectedFunction) (GString *buf);
 
index 59c0cd9e76ee42234f79df2340a9059dbf15892c..8a853668478189ec737cc608cd7e2bdae415388d 100644 (file)
@@ -31,7 +31,7 @@ main (int argc, char *argv[])
        GString *header;
        GHashTable *ht;
 
-       env = zak_cgi_main_dump_cookies ();
+       env = zak_cgi_main_dump_cookies (NULL);
 
        str = g_string_new ("<html>\n"
                            "<head><title>Cookies</title></head>\n"
index 4b934f2a2fe4e7363ddb484c654f216ccf0858cd..2e2629bf82f612fced1f9216853c64f7c8a9cab2 100644 (file)
@@ -30,7 +30,7 @@ main (int argc, char *argv[])
        GString *str;
        GHashTable *ht;
 
-       env = zak_cgi_main_dump_env ();
+       env = zak_cgi_main_dump_env (NULL);
 
        str = g_string_new ("<html>\n"
                                                "<head><title>Environment variables</title></head>\n"
@@ -39,7 +39,7 @@ main (int argc, char *argv[])
        g_string_append_printf (str, "%s\n</body>", env);
        g_free (env);
 
-       env = zak_cgi_main_get_stdin ();
+       env = zak_cgi_main_get_stdin (NULL);
        /*syslog (LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), "stdin: %s", env);*/
        if (env != NULL)
                {
index 6048445dfdbd9547f48cfe009a2c28bcc1f60f98..4b18d7e7774a0529f3a7580805715622188f967d 100644 (file)
@@ -28,7 +28,7 @@ main (int argc, char *argv[])
        gpointer key;
        gpointer value;
 
-       ht_env = zak_cgi_main_get_parameters (NULL);
+       ht_env = zak_cgi_main_get_parameters (NULL, NULL);
 
        str = g_string_new ("<html>\n"
                            "<head><title>Query string</title></head>\n"
index 890dc5b61fff60a4b7e4f3ac4a942c860d98acc9..bdc0f199951b6e7d2bf3ebe5e6de06b7010205fa 100644 (file)
@@ -23,7 +23,7 @@ main (int argc, char *argv[])
 {
        GHashTable *ht_env;
 
-       ht_env = zak_cgi_main_get_parameters (NULL);
+       ht_env = zak_cgi_main_get_parameters (NULL, NULL);
 
        zak_cgi_main_redirect ((gchar *)g_value_get_string ((GValue *)(const gchar *)g_hash_table_lookup (ht_env, "redirectto")));
 
index 4a7ed813496ea60667e0b6294e7544fa7ab6a048..f86ffc73a86adce316402588fe195b4f1d6b725c 100644 (file)
@@ -34,13 +34,13 @@ main (int argc, char *argv[])
 
        gchar *method;
 
-       session = zak_cgi_session_new ();
+       session = zak_cgi_session_new (NULL);
 
        str = g_string_new ("<html>\n"
                            "<head><title>Session Cookie</title></head>\n"
                            "<body>\n");
 
-       ht = zak_cgi_main_get_env ();
+       ht = zak_cgi_main_get_env (NULL);
        if (ht != NULL)
                {
                        method = g_hash_table_lookup (ht, "REQUEST_METHOD");
@@ -52,7 +52,7 @@ main (int argc, char *argv[])
                                                {
                                                        gchar **boundary = g_strsplit (splitted[1], "=", 2);
 
-                                                       env = zak_cgi_main_get_stdin ();
+                                                       env = zak_cgi_main_get_stdin (NULL);
 
                                                        ht_stdin = zak_cgi_main_parse_stdin (env, boundary[1]);
 
index 22ddfe5f560f4bfefa0bdd37f6a8f3f496c6bcce..65727f54161f209cb05f8aca6301c6aa94e62406 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char *argv[])
                            "<head><title>Url</title></head>\n"
                            "<body>\n");
 
-       url = zak_cgi_url_new ();
+       url = zak_cgi_url_new (NULL);
 
        zak_cgi_url_connect (url, "thecontroller", "theaction", (ZakCgiUrlConnectedFunction)hook, str);