From 4c2595c6a3a8e50a2dc8177784d53450879ac7e1 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Tue, 7 Jul 2015 18:06:59 +0200 Subject: [PATCH] Enabled caching operations. --- libzakcgi.pc.in | 2 +- src/main.c | 114 +++++++++++++++++++++++++++++++++++++++----- src/main.h | 12 ++--- src/session.c | 9 ++-- src/session.h | 4 +- src/url.c | 11 +++-- src/url.h | 4 +- tests/cookies.c | 2 +- tests/env.c | 4 +- tests/querystring.c | 2 +- tests/redirect.c | 2 +- tests/session.c | 6 +-- tests/url.c | 2 +- 13 files changed, 138 insertions(+), 36 deletions(-) diff --git a/libzakcgi.pc.in b/libzakcgi.pc.in index edc6b1c..ae02418 100644 --- a/libzakcgi.pc.in +++ b/libzakcgi.pc.in @@ -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} diff --git a/src/main.c b/src/main.c index a0ed5d5..6451161 100644 --- a/src/main.c +++ b/src/main.c @@ -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); diff --git a/src/main.h b/src/main.h index c262210..aa608f7 100644 --- a/src/main.h +++ b/src/main.h @@ -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); diff --git a/src/session.c b/src/session.c index e0a617e..8567c1b 100644 --- a/src/session.c +++ b/src/session.c @@ -24,7 +24,6 @@ #include -#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) diff --git a/src/session.h b/src/session.h index 024fd55..f6f1839 100644 --- a/src/session.h +++ b/src/session.h @@ -22,6 +22,8 @@ #include +#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); diff --git a/src/url.c b/src/url.c index ed79052..8f5f06a 100644 --- a/src/url.c +++ b/src/url.c @@ -22,7 +22,6 @@ #include -#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) { diff --git a/src/url.h b/src/url.h index 5e53601..53571e3 100644 --- a/src/url.h +++ b/src/url.h @@ -22,6 +22,8 @@ #include +#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); diff --git a/tests/cookies.c b/tests/cookies.c index 59c0cd9..8a85366 100644 --- a/tests/cookies.c +++ b/tests/cookies.c @@ -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 ("\n" "Cookies\n" diff --git a/tests/env.c b/tests/env.c index 4b934f2..2e2629b 100644 --- a/tests/env.c +++ b/tests/env.c @@ -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 ("\n" "Environment variables\n" @@ -39,7 +39,7 @@ main (int argc, char *argv[]) g_string_append_printf (str, "%s\n", 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) { diff --git a/tests/querystring.c b/tests/querystring.c index 6048445..4b18d7e 100644 --- a/tests/querystring.c +++ b/tests/querystring.c @@ -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 ("\n" "Query string\n" diff --git a/tests/redirect.c b/tests/redirect.c index 890dc5b..bdc0f19 100644 --- a/tests/redirect.c +++ b/tests/redirect.c @@ -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"))); diff --git a/tests/session.c b/tests/session.c index 4a7ed81..f86ffc7 100644 --- a/tests/session.c +++ b/tests/session.c @@ -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 ("\n" "Session Cookie\n" "\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]); diff --git a/tests/url.c b/tests/url.c index 22ddfe5..65727f5 100644 --- a/tests/url.c +++ b/tests/url.c @@ -36,7 +36,7 @@ main (int argc, char *argv[]) "Url\n" "\n"); - url = zak_cgi_url_new (); + url = zak_cgi_url_new (NULL); zak_cgi_url_connect (url, "thecontroller", "theaction", (ZakCgiUrlConnectedFunction)hook, str); -- 2.49.0