myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [SCM] GNU MyServer branch, master, updated. 5aeeeb1fce


From: Giuseppe Scrivano
Subject: [myserver-commit] [SCM] GNU MyServer branch, master, updated. 5aeeeb1fce51521bcd6b20b15bd19e3be8173d26
Date: Sun, 11 Oct 2009 17:28:10 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU MyServer".

The branch, master has been updated
       via  5aeeeb1fce51521bcd6b20b15bd19e3be8173d26 (commit)
       via  ec5c9bab59a379e18c5a83b06f5d1bb1de1c2af5 (commit)
      from  4e6ea68e68ec47bd3376421e211576036f4d9d48 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------


commit 5aeeeb1fce51521bcd6b20b15bd19e3be8173d26
Merge: ec5c9ba 4e6ea68
Author: Giuseppe Scrivano <address@hidden>
Date:   Sun Oct 11 19:27:37 2009 +0200

    Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/myserver




commit ec5c9bab59a379e18c5a83b06f5d1bb1de1c2af5
Author: Giuseppe Scrivano <address@hidden>
Date:   Sun Oct 11 19:25:26 2009 +0200

    Refactor a new class `XmlMimeHandler' out of `MimeManager'.

diff --git a/myserver/include/conf/mime/Makefile.am 
b/myserver/include/conf/mime/Makefile.am
index 6682842..70ced8a 100644
--- a/myserver/include/conf/mime/Makefile.am
+++ b/myserver/include/conf/mime/Makefile.am
@@ -1,4 +1,4 @@
 mimeincludedir=$(includedir)/myserver/include/conf/mime
-mimeinclude_HEADERS = mime_manager.h
+mimeinclude_HEADERS = mime_manager.h xml_mime_handler.h
 SUBDIRS =
 
diff --git a/myserver/include/conf/mime/mime_manager.h 
b/myserver/include/conf/mime/mime_manager.h
index 8881ab6..f96b46c 100644
--- a/myserver/include/conf/mime/mime_manager.h
+++ b/myserver/include/conf/mime/mime_manager.h
@@ -50,12 +50,6 @@ extern "C"
 
 using namespace std;
 
-struct PathRegex
-{
-  Regex *regex;
-  int record;
-};
-
 struct MimeRecord
 {
   list<string> filters;
@@ -80,47 +74,32 @@ struct MimeRecord
 class MimeManagerHandler
 {
 public:
+  virtual int load (const char *resource){return 0;}
+  virtual void close (){}
   virtual MimeRecord* getMIME (const char *file){return NULL;}
   virtual MimeRecord* getMIME (string const &file)
   {return getMIME (file.c_str ());}
+  virtual u_long reload (){return 0;}
 };
 
+
 class MimeManager
 {
 public:
   MimeManager ();
   ~MimeManager ();
-  u_long getNumMIMELoaded ();
-
   u_long reload ();
-  u_long loadXML (XmlParser* parser);
-  u_long loadXML (const char *filename);
-  u_long loadXML (string &filename) {return loadXML (filename.c_str ());}
-
   MimeRecord* getMIME (const char *file, const char *handler = NULL);
-  MimeRecord* getMIME (string const &file, const char *handler = NULL);
-
-  bool isLoaded ();
-  void clean ();
-  int addRecord (MimeRecord *record);
-
-  static MimeRecord *readRecord (xmlNodePtr node);
-
+  MimeRecord* getMIME (string const &file, const char *handler = NULL)
+  {
+    return getMIME (file.c_str (), handler);
+  }
   void registerHandler (string &name, MimeManagerHandler *handler);
-
-protected:
-  const char *getFilename ();
-  void clearRecords ();
-
+  void setDefaultHandler (string &name);
+  void clean ();
 private:
+  MimeManagerHandler *defHandler;
   HashMap<string, MimeManagerHandler*> handlers;
-  bool loaded;
-  HashMap<string, int> extIndex;
-  vector<MimeRecord*> records;
-  list<PathRegex*> pathRegex;
-
-  u_long numMimeTypesLoaded;
-  string filename;
 };
 
 #endif
diff --git a/myserver/include/conf/mime/mime_manager.h 
b/myserver/include/conf/mime/xml_mime_handler.h
similarity index 62%
copy from myserver/include/conf/mime/mime_manager.h
copy to myserver/include/conf/mime/xml_mime_handler.h
index 8881ab6..4f37804 100644
--- a/myserver/include/conf/mime/mime_manager.h
+++ b/myserver/include/conf/mime/xml_mime_handler.h
@@ -1,7 +1,7 @@
 /* -*- mode: c++ -*- */
 /*
 MyServer
-Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (C) 2009 Free Software Foundation, Inc.
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 3 of the License, or
@@ -16,8 +16,8 @@ You should have received a copy of the GNU General Public 
License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef MIME_MANAGER_H
-# define MIME_MANAGER_H
+#ifndef XML_MIME_HANDLER_H
+# define XML_MIME_HANDLER_H
 
 # include <include/base/utility.h>
 # include <include/base/hash_map/hash_map.h>
@@ -25,6 +25,7 @@ along with this program.  If not, see 
<http://www.gnu.org/licenses/>.
 # include <include/base/xml/xml_parser.h>
 # include <include/base/regex/myserver_regex.h>
 # include <include/conf/nodetree.h>
+# include <include/conf/mime/mime_manager.h>
 
 # ifdef WIN32
 #  include <windows.h>
@@ -50,77 +51,47 @@ extern "C"
 
 using namespace std;
 
-struct PathRegex
-{
-  Regex *regex;
-  int record;
-};
-
-struct MimeRecord
-{
-  list<string> filters;
-  list<string> extensions;
-  string mimeType;
-  string cmdName;
-  string cgiManager;
-  bool selfExecuted;
-  list<Regex*> pathRegex;
-  HashMap<string, NodeTree<string>*> hashedData;
-
-  MimeRecord ();
-  MimeRecord (MimeRecord&);
-  int addFilter (const char*, bool acceptDuplicate = true);
-  ~MimeRecord ();
-  void clear ();
-  const char* getData (string &name);
-  NodeTree<string>* getNodeTree (string &name);
-};
-
 
-class MimeManagerHandler
+class XmlMimeHandler : public MimeManagerHandler
 {
 public:
-  virtual MimeRecord* getMIME (const char *file){return NULL;}
+  XmlMimeHandler ();
+  virtual ~XmlMimeHandler ();
+  virtual int load (const char *resource){return 0;}
+  virtual void close (){}
+  virtual MimeRecord* getMIME (const char *file);
   virtual MimeRecord* getMIME (string const &file)
   {return getMIME (file.c_str ());}
-};
-
-class MimeManager
-{
-public:
-  MimeManager ();
-  ~MimeManager ();
   u_long getNumMIMELoaded ();
 
-  u_long reload ();
   u_long loadXML (XmlParser* parser);
   u_long loadXML (const char *filename);
   u_long loadXML (string &filename) {return loadXML (filename.c_str ());}
 
-  MimeRecord* getMIME (const char *file, const char *handler = NULL);
-  MimeRecord* getMIME (string const &file, const char *handler = NULL);
-
-  bool isLoaded ();
+  virtual u_long reload ();
+  bool isLoaded (){return loaded;}
   void clean ();
   int addRecord (MimeRecord *record);
 
   static MimeRecord *readRecord (xmlNodePtr node);
-
-  void registerHandler (string &name, MimeManagerHandler *handler);
-
 protected:
   const char *getFilename ();
   void clearRecords ();
 
 private:
-  HashMap<string, MimeManagerHandler*> handlers;
-  bool loaded;
+  struct PathRegex
+  {
+    Regex *regex;
+    int record;
+  };
+
   HashMap<string, int> extIndex;
   vector<MimeRecord*> records;
   list<PathRegex*> pathRegex;
 
   u_long numMimeTypesLoaded;
   string filename;
+  bool loaded;
 };
 
 #endif
diff --git a/myserver/include/conf/vhost/vhost.h 
b/myserver/include/conf/vhost/vhost.h
index b2ebdd2..f03a517 100644
--- a/myserver/include/conf/vhost/vhost.h
+++ b/myserver/include/conf/vhost/vhost.h
@@ -36,6 +36,7 @@
 # include <include/connections_scheduler/listen_threads.h>
 # include <include/conf/vhost/ip.h>
 # include <include/conf/nodetree.h>
+# include <include/conf/mime/mime_manager.h>
 
 using namespace std;
 typedef int (*NULL_REFERENCECB)(class Vhost*);
@@ -108,11 +109,6 @@ public:
   list<StringRegex*>* getHostList ()
   {return &hostList;}
 
-  //TODO: remove
-  ///*! List of IPs allowed by the vhost. */
-  //list<StringRegex*>* getIpList ()
-  //{return &ipList;}
-
   /*! Return the port used by the host. */
   u_short getPort ()
   {return port;}
@@ -168,7 +164,7 @@ public:
   int areAllIPAllowed ();
   int isIPAllowed (const char*);
 
-  MimeManager* getMIME ();
+  MimeManagerHandler *getMIME ();
 
   /*!
    * \return 0 if the LogManager contains at least one valid entry where
@@ -220,8 +216,7 @@ private:
   LogManager* logManager;
 
   HashMap<string, MimeRecord*> locationsMime;
-
-  MimeManager mimeManager;
+  MimeManagerHandler *mimeHandler;
 
   /*! The default priority for the connections scheduler.  */
   int defaultPriority;
diff --git a/myserver/include/server/server.h b/myserver/include/server/server.h
index 5255c18..d438414 100644
--- a/myserver/include/server/server.h
+++ b/myserver/include/server/server.h
@@ -48,6 +48,7 @@ along with this program.  If not, see 
<http://www.gnu.org/licenses/>.
 # include <include/conf/security/auth_method_factory.h>
 # include <include/conf/security/validator_factory.h>
 # include <include/conf/main/main_configuration.h>
+# include <include/conf/mime/xml_mime_handler.h>
 
 # include <include/base/slab/slab.h>
 
@@ -142,7 +143,7 @@ public:
 
   void *getEnvString (){return envString;}
   VhostManager *getVhosts (){return vhostList;}
-  MimeManager *getMimeManager (){return mimeManager;}
+  MimeManager *getMimeManager (){return &mimeManager;}
 
   void setProcessPermissions ();
   ConnectionsScheduler* getConnectionsScheduler (){return 
&connectionsScheduler;}
@@ -165,6 +166,7 @@ public:
 private:
   friend class ClientsThread;
   XmlValidator *xmlValidator;
+  XmlMimeHandler xmlMimeHandler;
 
   MainConfiguration *configurationFileManager;
   MainConfiguration* (*genMainConf) (Server *server, const char *arg);
@@ -200,7 +202,7 @@ private:
 
   void *envString;
   VhostManager *vhostList;
-  MimeManager *mimeManager;
+  MimeManager mimeManager;
   HomeDir homeDir;
 
   list<NodeTree<string>*> hashedDataTrees;
diff --git a/myserver/src/conf/mime/Makefile.am 
b/myserver/src/conf/mime/Makefile.am
index a05690f..66dddf2 100644
--- a/myserver/src/conf/mime/Makefile.am
+++ b/myserver/src/conf/mime/Makefile.am
@@ -1,5 +1,5 @@
 lib_LIBRARIES = libmime.a
-libmime_a_SOURCES = mime_manager.cpp
+libmime_a_SOURCES = mime_manager.cpp xml_mime_handler.cpp
 SUBDIRS =
 AM_CPPFLAGS = $(all_includes)
 
diff --git a/myserver/src/conf/mime/mime_manager.cpp 
b/myserver/src/conf/mime/mime_manager.cpp
index a4fa5f6..ada7fdf 100644
--- a/myserver/src/conf/mime/mime_manager.cpp
+++ b/myserver/src/conf/mime/mime_manager.cpp
@@ -145,184 +145,17 @@ const char* MimeRecord::getData (string &name)
 }
 
 /*!
- * Get the name of the used file.
- */
-const char *MimeManager::getFilename ()
-{
-  return filename.c_str ();
-}
-
-/*!
- * Read a MIME record from a XML node.
- */
-MimeRecord *MimeManager::readRecord (xmlNodePtr node)
-{
-  xmlNodePtr lcur = node->children;
-  xmlAttr *attrs;
-
-  MimeRecord *rc = new MimeRecord;
-
-  for (attrs = node->properties; attrs; attrs = attrs->next)
-  {
-    if (!xmlStrcmp (attrs->name, (const xmlChar *)"handler") &&
-        attrs->children && attrs->children->content)
-      rc->cmdName.assign ((const char*)attrs->children->content);
-
-    if (!xmlStrcmp (attrs->name, (const xmlChar *)"self") &&
-        attrs->children && attrs->children->content)
-      rc->selfExecuted = xmlStrcmp (attrs->children->content,
-                                    (const xmlChar *)"YES");
-
-    if (!xmlStrcmp (attrs->name, (const xmlChar *)"mime") &&
-        attrs->children && attrs->children->content)
-      rc->mimeType.assign ((const char*)attrs->children->content);
-
-    if (!xmlStrcmp (attrs->name, (const xmlChar *)"param") &&
-        attrs->children && attrs->children->content)
-      rc->cgiManager.assign ((const char*)attrs->children->content);
-  }
-
-  for ( ;lcur; lcur = lcur->next)
-  {
-    if (lcur->name && !xmlStrcmp (lcur->name, (const xmlChar *)"EXTENSION"))
-    {
-      for (attrs = lcur->properties; attrs; attrs = attrs->next)
-      {
-        if (!xmlStrcmp (attrs->name, (const xmlChar *)"value") &&
-            attrs->children && attrs->children->content)
-        {
-          string ext ((const char*)attrs->children->content);
-          rc->extensions.push_back (ext);
-        }
-      }
-    }
-
-    if (lcur->name && !xmlStrcmp (lcur->name, (const xmlChar *)"DEFINE"))
-    {
-      const char *name = NULL;
-      const char *value = NULL;
-
-      for (attrs = lcur->properties; attrs; attrs = attrs->next)
-      {
-        if (!xmlStrcmp (attrs->name, (const xmlChar *)"name") &&
-            attrs->children && attrs->children->content)
-          name = (const char*)attrs->children->content;
-
-        if (!xmlStrcmp (attrs->name, (const xmlChar *)"value") &&
-            attrs->children && attrs->children->content)
-          value = (const char*)attrs->children->content;
-      }
-
-      if (name && value)
-      {
-        string key (name);
-       string val (value);
-       NodeTree<string> *nt = new NodeTree<string> (val);
-        rc->hashedData.put (key, nt);
-      }
-
-    }
-
-    if (lcur->name && !xmlStrcmp (lcur->name, (const xmlChar *)"PATH"))
-    {
-      for (attrs = lcur->properties; attrs; attrs = attrs->next)
-      {
-        if (!xmlStrcmp (attrs->name, (const xmlChar *)"regex") &&
-            attrs->children && attrs->children->content)
-        {
-          Regex *r = new Regex;
-
-          if (r->compile ((const char*)attrs->children->content, 0))
-            {
-              delete r;
-              return NULL;
-            }
-
-          rc->pathRegex.push_back (r);
-        }
-      }
-    }
-
-    if (lcur->name && !xmlStrcmp (lcur->name, (const xmlChar *)"FILTER"))
-    {
-      for (attrs = lcur->properties; attrs; attrs = attrs->next)
-      {
-        if (!xmlStrcmp (attrs->name, (const xmlChar *)"value") &&
-            attrs->children && attrs->children->content)
-          rc->addFilter ((const char*)attrs->children->content);
-      }
-    }
-  }
-
-  return rc;
-}
-
-/*!
  * Reload using the same configuration file.
  */
 u_long MimeManager::reload ()
 {
-  if (!filename.length ())
-    return -1;
+ HashMap<string, MimeManagerHandler*>::Iterator it = handlers.begin ();
+  for (;it != handlers.end (); it++)
+    (*it)->reload ();
 
-  return loadXML (getFilename ());
+  return 0;
 }
 
-/*!
- * Load the MIME types from a XML file. Returns the number of
- * MIME types loaded successfully.
- */
-u_long MimeManager::loadXML (const char *fn)
-{
-  XmlParser parser;
-  u_long ret = 0;
-
-  if (parser.open (fn))
-    return -1;
-
-  filename.assign (fn);
-
-  ret = loadXML (&parser);
-
-  parser.close ();
-
-  return ret;
-}
-
-/*!
- * Load the MIME types from a XML parser object. Returns the number
- * of MIME types loaded successfully.
- */
-u_long MimeManager::loadXML (XmlParser* parser)
-{
-  xmlNodePtr node;
-  xmlDocPtr doc;
-
-  clearRecords ();
-
-  doc = parser->getDoc ();
-  node = doc->children->children;
-
-  for (; node; node = node->next)
-  {
-    if (xmlStrcmp (node->name, (const xmlChar *)"MIME"))
-      continue;
-
-    MimeRecord *rc = readRecord (node);
-
-    if (rc)
-      addRecord (rc);
-  }
-
-  /*! Store the loaded status. */
-  loaded = true;
-
-  return getNumMIMELoaded ();
-}
-
-/*!
- * Destroy the object.
- */
 MimeManager::~MimeManager ()
 {
   clean ();
@@ -333,12 +166,7 @@ MimeManager::~MimeManager ()
  */
 void MimeManager::clean ()
 {
-  if (loaded)
-  {
-    loaded = false;
-    filename.assign ("");
-    clearRecords ();
-  }
+
 }
 
 /*!
@@ -346,121 +174,14 @@ void MimeManager::clean ()
  */
 MimeManager::MimeManager ()
 {
-  loaded = false;
-}
-
-/*!
- * Add a new record.
- * \return Return the position for the new record.
- */
-int MimeManager::addRecord (MimeRecord *mr)
-{
-  u_long position = records.size ();
-
-  records.push_back (mr);
-
-  for (list<string>::iterator it = mr->extensions.begin ();
-       it != mr->extensions.end (); it++)
-    {
-      string &ext = *it;
-
-#ifdef MIME_LOWER_CASE
-      transform (ext.begin (), ext.end (), ext.begin (), ::tolower);
-#endif
-      extIndex.put (ext, position);
-    }
-
-  for (list<Regex*>::iterator it = mr->pathRegex.begin ();
-       it != mr->pathRegex.end (); it++)
-    {
-      PathRegex *pr = new PathRegex;
-      pr->regex = *it;
-      pr->record = position;
-
-      pathRegex.push_back (pr);
-    }
-
-  return position;
+  defHandler = NULL;
 }
 
 /*!
- * Remove all the stored records.
- */
-void MimeManager::clearRecords ()
-{
-  vector <MimeRecord*>::iterator i = records.begin ();
-
-  while (i != records.end ())
-    {
-      MimeRecord *r = *i;
-      if (r)
-        delete r;
-      i++;
-    }
-
-  for (list<PathRegex*>::iterator it = pathRegex.begin ();
-       it != pathRegex.end (); it++)
-    delete *it;
-
-
-  for (HashMap<string, MimeManagerHandler*>::Iterator it = handlers.begin ();
-       it != handlers.end (); it++)
-    delete *it;
-
-  pathRegex.clear ();
-  records.clear ();
-
-  extIndex.clear ();
-
-  /* The first record is not used to store information.  */
-  records.push_back (NULL);
-}
-
-/*!
- * Get the MIME type to use on the specified file.
- * \param filename Find the MIME type for this file.
- * \param handler If specified, indicate an external handler to use
- * if the mime cannot be found locally.
- */
-MimeRecord *MimeManager::getMIME (string const &filename, const char *handler)
-{
-  return getMIME (filename.c_str (), handler);
-}
-
-/*!
- * Get the MIME type to use on the specified file.
- * \param filename Find the MIME type for this file.
- * \param handler If specified, indicate an external handler to use
- * if the mime cannot be found locally.
+ * Get the MIME record using the registered handlers.
  */
 MimeRecord *MimeManager::getMIME (const char *filename, const char *handler)
 {
-  string ext;
-  u_long pos = 0;
-
-  for (list<PathRegex*>::iterator it = pathRegex.begin ();
-       it != pathRegex.end ();
-       it++)
-  {
-    PathRegex *pr = *it;
-    regmatch_t pm;
-
-    if (pr->regex->exec (filename, 1, &pm, 0) == 0)
-    {
-      pos = pr->record;
-      break;
-    }
-  }
-
-  if (pos == 0)
-    {
-      FilesUtility::getFileExt (ext, filename);
-      pos = extIndex.get (ext.c_str ());
-    }
-
-  if (pos)
-    return records [pos];
-
   if (handler)
     {
       MimeManagerHandler *h = handlers.get (handler);
@@ -468,6 +189,9 @@ MimeRecord *MimeManager::getMIME (const char *filename, 
const char *handler)
         return h->getMIME (filename);
     }
 
+  if (defHandler)
+    return defHandler->getMIME (filename);
+
   return NULL;
 }
 
@@ -485,17 +209,11 @@ void MimeManager::registerHandler (string &name, 
MimeManagerHandler *handler)
 }
 
 /*!
- * Returns the number of MIME types loaded.
- */
-u_long MimeManager::getNumMIMELoaded ()
-{
-  return records.size () -1;
-}
-
-/*!
- * Check if the MIME manager is loaded.
+ * Set the default handler specifying its name.
+ *
+ * \param name The default handler name.
  */
-bool MimeManager::isLoaded ()
+void MimeManager::setDefaultHandler (string &name)
 {
-  return loaded;
+  defHandler = handlers.get (name);
 }
diff --git a/myserver/src/conf/mime/mime_manager.cpp 
b/myserver/src/conf/mime/xml_mime_handler.cpp
similarity index 66%
copy from myserver/src/conf/mime/mime_manager.cpp
copy to myserver/src/conf/mime/xml_mime_handler.cpp
index a4fa5f6..7e047a4 100644
--- a/myserver/src/conf/mime/mime_manager.cpp
+++ b/myserver/src/conf/mime/xml_mime_handler.cpp
@@ -16,7 +16,7 @@ along with this program.  If not, see 
<http://www.gnu.org/licenses/>.
 */
 
 #include "stdafx.h"
-#include <include/conf/mime/mime_manager.h>
+#include <include/conf/mime/xml_mime_handler.h>
 #include <include/base/file/file.h>
 #include <include/base/string/stringutils.h>
 #include <include/server/server.h>
@@ -31,123 +31,10 @@ along with this program.  If not, see 
<http://www.gnu.org/licenses/>.
 
 using namespace std;
 
-MimeRecord::MimeRecord ()
-{
-  filters.clear ();
-  extensions.clear ();
-  mimeType.assign ("");
-  cgiManager.assign ("");
-  cmdName.assign ("");
-  selfExecuted = false;
-}
-
-/*!
- * Destroy the object.
- */
-MimeRecord::~MimeRecord ()
-{
-  clear ();
-}
-
-/*!
- * Add a filter to the list of filters to apply on this MIME type.
- * Return zero if the filters was not added.
- */
-int MimeRecord::addFilter (const char* n, bool acceptDuplicate)
-{
-  if (!acceptDuplicate)
-  {
-    list<string>::iterator i = filters.begin ();
-    for (; i != filters.end (); i++)
-    {
-      if (!stringcmpi (*i, n))
-        return 0;
-    }
-  }
-
-  filters.push_back (n);
-  return 1;
-}
-
-/*!
- * Copy constructor.
- */
-MimeRecord::MimeRecord (MimeRecord& m)
-{
-  list<string>::iterator i = m.filters.begin ();
-
-  filters.clear ();
-
-  for ( ; i != m.filters.end (); i++)
-  {
-    filters.push_back (*i);
-  }
-
-  i = m.extensions.begin ();
-
-  extensions.clear ();
-
-  for ( ; i != m.extensions.end (); i++)
-  {
-    filters.push_back (*i);
-  }
-
-  selfExecuted = m.selfExecuted;
-  mimeType.assign (m.mimeType);
-  cmdName.assign (m.cmdName);
-  cgiManager.assign (m.cgiManager);
-}
-
-/*!
-  *Clear the used memory.
-  */
-void MimeRecord::clear ()
-{
-  filters.clear ();
-  extensions.clear ();
-  mimeType.assign ("");
-  cmdName.assign ("");
-  cgiManager.assign ("");
-
-  for (list<Regex*>::iterator it = pathRegex.begin ();
-       it != pathRegex.end ();
-       it++)
-  {
-    delete *it;
-  }
-
-  HashMap<string, NodeTree<string>*>::Iterator it = hashedData.begin ();
-  for (;it != hashedData.end (); it++)
-    delete (*it);
-  hashedData.clear ();
-
-  pathRegex.clear ();
-}
-
-/*!
- * Get the node tree stored in the hash dictionary for the `name' key.
- */
-NodeTree<string>* MimeRecord::getNodeTree (string &name)
-{
-  return hashedData.get (name);
-}
-
-/*!
- * Get the value stored in the hash dictionary for the `name' key.
- */
-const char* MimeRecord::getData (string &name)
-{
-  NodeTree<string> *str = hashedData.get (name);
-  if (str)
-    return str->getValue ()->c_str ();
-
-  return NULL;
-}
-
 /*!
  * Get the name of the used file.
  */
-const char *MimeManager::getFilename ()
+const char *XmlMimeHandler::getFilename ()
 {
   return filename.c_str ();
 }
@@ -155,7 +42,7 @@ const char *MimeManager::getFilename ()
 /*!
  * Read a MIME record from a XML node.
  */
-MimeRecord *MimeManager::readRecord (xmlNodePtr node)
+MimeRecord *XmlMimeHandler::readRecord (xmlNodePtr node)
 {
   xmlNodePtr lcur = node->children;
   xmlAttr *attrs;
@@ -216,11 +103,10 @@ MimeRecord *MimeManager::readRecord (xmlNodePtr node)
       if (name && value)
       {
         string key (name);
-       string val (value);
-       NodeTree<string> *nt = new NodeTree<string> (val);
+        string val (value);
+        NodeTree<string> *nt = new NodeTree<string> (val);
         rc->hashedData.put (key, nt);
       }
-
     }
 
     if (lcur->name && !xmlStrcmp (lcur->name, (const xmlChar *)"PATH"))
@@ -260,7 +146,7 @@ MimeRecord *MimeManager::readRecord (xmlNodePtr node)
 /*!
  * Reload using the same configuration file.
  */
-u_long MimeManager::reload ()
+u_long XmlMimeHandler::reload ()
 {
   if (!filename.length ())
     return -1;
@@ -272,7 +158,7 @@ u_long MimeManager::reload ()
  * Load the MIME types from a XML file. Returns the number of
  * MIME types loaded successfully.
  */
-u_long MimeManager::loadXML (const char *fn)
+u_long XmlMimeHandler::loadXML (const char *fn)
 {
   XmlParser parser;
   u_long ret = 0;
@@ -293,7 +179,7 @@ u_long MimeManager::loadXML (const char *fn)
  * Load the MIME types from a XML parser object. Returns the number
  * of MIME types loaded successfully.
  */
-u_long MimeManager::loadXML (XmlParser* parser)
+u_long XmlMimeHandler::loadXML (XmlParser* parser)
 {
   xmlNodePtr node;
   xmlDocPtr doc;
@@ -323,7 +209,7 @@ u_long MimeManager::loadXML (XmlParser* parser)
 /*!
  * Destroy the object.
  */
-MimeManager::~MimeManager ()
+XmlMimeHandler::~XmlMimeHandler ()
 {
   clean ();
 }
@@ -331,12 +217,12 @@ MimeManager::~MimeManager ()
 /*!
  * Clean the memory allocated by the structure.
  */
-void MimeManager::clean ()
+void XmlMimeHandler::clean ()
 {
   if (loaded)
   {
     loaded = false;
-    filename.assign ("");
+    filename = "";
     clearRecords ();
   }
 }
@@ -344,7 +230,7 @@ void MimeManager::clean ()
 /*!
  * Constructor of the class.
  */
-MimeManager::MimeManager ()
+XmlMimeHandler::XmlMimeHandler ()
 {
   loaded = false;
 }
@@ -353,7 +239,7 @@ MimeManager::MimeManager ()
  * Add a new record.
  * \return Return the position for the new record.
  */
-int MimeManager::addRecord (MimeRecord *mr)
+int XmlMimeHandler::addRecord (MimeRecord *mr)
 {
   u_long position = records.size ();
 
@@ -386,7 +272,7 @@ int MimeManager::addRecord (MimeRecord *mr)
 /*!
  * Remove all the stored records.
  */
-void MimeManager::clearRecords ()
+void XmlMimeHandler::clearRecords ()
 {
   vector <MimeRecord*>::iterator i = records.begin ();
 
@@ -402,11 +288,6 @@ void MimeManager::clearRecords ()
        it != pathRegex.end (); it++)
     delete *it;
 
-
-  for (HashMap<string, MimeManagerHandler*>::Iterator it = handlers.begin ();
-       it != handlers.end (); it++)
-    delete *it;
-
   pathRegex.clear ();
   records.clear ();
 
@@ -422,18 +303,7 @@ void MimeManager::clearRecords ()
  * \param handler If specified, indicate an external handler to use
  * if the mime cannot be found locally.
  */
-MimeRecord *MimeManager::getMIME (string const &filename, const char *handler)
-{
-  return getMIME (filename.c_str (), handler);
-}
-
-/*!
- * Get the MIME type to use on the specified file.
- * \param filename Find the MIME type for this file.
- * \param handler If specified, indicate an external handler to use
- * if the mime cannot be found locally.
- */
-MimeRecord *MimeManager::getMIME (const char *filename, const char *handler)
+MimeRecord *XmlMimeHandler::getMIME (const char *filename)
 {
   string ext;
   u_long pos = 0;
@@ -461,41 +331,13 @@ MimeRecord *MimeManager::getMIME (const char *filename, 
const char *handler)
   if (pos)
     return records [pos];
 
-  if (handler)
-    {
-      MimeManagerHandler *h = handlers.get (handler);
-      if (h)
-        return h->getMIME (filename);
-    }
-
   return NULL;
 }
 
 /*!
- * Register an external handler under the specified name.
- *
- * \param name Handler name.
- * \param handler Handler object to register.
- */
-void MimeManager::registerHandler (string &name, MimeManagerHandler *handler)
-{
-  MimeManagerHandler *old = handlers.put (name, handler);
-  if (old)
-    delete old;
-}
-
-/*!
  * Returns the number of MIME types loaded.
  */
-u_long MimeManager::getNumMIMELoaded ()
+u_long XmlMimeHandler::getNumMIMELoaded ()
 {
   return records.size () -1;
 }
-
-/*!
- * Check if the MIME manager is loaded.
- */
-bool MimeManager::isLoaded ()
-{
-  return loaded;
-}
diff --git a/myserver/src/conf/vhost/vhost.cpp 
b/myserver/src/conf/vhost/vhost.cpp
index 202135a..9e0ba69 100644
--- a/myserver/src/conf/vhost/vhost.cpp
+++ b/myserver/src/conf/vhost/vhost.cpp
@@ -59,6 +59,7 @@ Vhost::Vhost (LogManager* lm)
   nullReferenceCb = 0;
   defaultPriority = 0;
   logManager = lm;
+  mimeHandler = NULL;
 }
 
 
@@ -75,15 +76,17 @@ Vhost::~Vhost ()
   freeHashedData ();
 
   HashMap<string, MimeRecord*>::Iterator it = locationsMime.begin ();
-
   while (it != locationsMime.end ())
     {
       delete *it;
       it++;
     }
 
+  if (mimeHandler)
+    delete mimeHandler;
+
   refMutex.destroy ();
-  mimeManager.clean ();
+  /*  mimeManager.clean ();*/
   logManager->remove (this);
 }
 
@@ -117,15 +120,15 @@ int Vhost::freeHashedData ()
  */
 int Vhost::isMIME ()
 {
-  return mimeManager.isLoaded ();
+  return mimeHandler ? 1 : 0;
 }
 
 /*!
- * Get the MIME manager for the virtual host.
+ * Get the MIME handler for the virtual host.
  */
-MimeManager* Vhost::getMIME ()
+MimeManagerHandler* Vhost::getMIME ()
 {
-  return &mimeManager;
+  return mimeHandler;
 }
 
 /*!
diff --git a/myserver/src/conf/vhost/vhost_manager.cpp 
b/myserver/src/conf/vhost/vhost_manager.cpp
index f5a0a38..8e0cfb0 100644
--- a/myserver/src/conf/vhost/vhost_manager.cpp
+++ b/myserver/src/conf/vhost/vhost_manager.cpp
@@ -16,9 +16,10 @@
 */
 #include <include/conf/vhost/vhost_manager.h>
 #include <include/conf/vhost/vhost.h>
-#include <include/conf/mime/mime_manager.h>
+#include <include/conf/mime/xml_mime_handler.h>
 #include <include/server/server.h>
 #include <include/base/file/files_utility.h>
+#include <include/conf/mime/xml_mime_handler.h>
 
 #include <include/conf/xml_conf.h>
 
@@ -380,7 +381,8 @@ int VhostManager::loadXMLConfigurationFile (const char 
*filename)
                   if (!xmlStrcmp (attrs->name, (const xmlChar *)"path"))
                     loc.append ((const char*) attrs->children->content);
                 }
-              MimeRecord *rc = MimeManager::readRecord (lcur);
+
+              MimeRecord *rc = XmlMimeHandler::readRecord (lcur);
               vh->locationsMime.put (loc, rc);
             }
           else if (!xmlStrcmp (lcur->name, (const xmlChar *)"SSL_PRIVATEKEY"))
@@ -488,7 +490,23 @@ int VhostManager::loadXMLConfigurationFile (const char 
*filename)
           else if (!xmlStrcmp (lcur->name, (const xmlChar *)"MIME_FILE"))
             {
               if (lcur->children)
-                vh->getMIME ()->loadXML ((char*)lcur->children->content);
+                {
+                  const char *filename = (const char*)lcur->children->content;
+                  XmlMimeHandler *xmlHandler = new XmlMimeHandler ();
+                  try
+                    {
+                      xmlHandler->loadXML (filename);
+                    }
+                  catch (...)
+                    {
+                      delete xmlHandler;
+                      xmlHandler = NULL;
+                      Server::getInstance ()->log (MYSERVER_LOG_MSG_ERROR,
+                                               _("Error loading %s"), 
filename);
+
+                    }
+                  vh->mimeHandler = xmlHandler;
+                }
             }
           else if (!xmlStrcmp (lcur->name, (const xmlChar *)"THROTTLING_RATE"))
             {
diff --git a/myserver/src/server/server.cpp b/myserver/src/server/server.cpp
index bd084a4..a0fe8cc 100644
--- a/myserver/src/server/server.cpp
+++ b/myserver/src/server/server.cpp
@@ -72,7 +72,6 @@ Server::Server () : connectionsScheduler (this),
   maxConnections = 0;
   serverReady = false;
   throttlingRate = 0;
-  mimeManager = 0;
   path = 0;
   ipAddresses = 0;
   vhostList = 0;
@@ -265,16 +264,15 @@ int Server::postLoad ()
   /* Load the MIME types.  */
   log (MYSERVER_LOG_MSG_INFO, _("Loading MIME types..."));
 
-  if (mimeManager)
-    delete mimeManager;
-
-  mimeManager = new MimeManager ();
-
-  if (int nMIMEtypes = mimeManager->loadXML (mimeConfigurationFile.c_str ()))
+  if (int nMIMEtypes = xmlMimeHandler.loadXML (mimeConfigurationFile.c_str ()))
     log (MYSERVER_LOG_MSG_INFO, _("Using %i MIME types"), nMIMEtypes);
   else
     log (MYSERVER_LOG_MSG_ERROR, _("Error while loading MIME types"));
 
+  string xml ("xml");
+  mimeManager.registerHandler (xml, &xmlMimeHandler);
+  mimeManager.setDefaultHandler (xml);
+
   log (MYSERVER_LOG_MSG_INFO, _("Detected %i CPUs"), (int) getCPUCount ());
 
   connectionsScheduler.restart ();
@@ -689,13 +687,6 @@ int Server::terminate ()
   ipAddresses = 0;
   vhostList = 0;
 
-  if (mimeManager)
-    {
-      mimeManager->clean ();
-      delete mimeManager;
-      mimeManager = 0;
-    }
-
 #ifdef WIN32
   /*
    * Under WIN32 cleanup environment strings.
diff --git a/plugins/src/mime_magic/mime_magic.cpp 
b/plugins/src/mime_magic/mime_magic.cpp
index b5da922..fe13ef4 100755
--- a/plugins/src/mime_magic/mime_magic.cpp
+++ b/plugins/src/mime_magic/mime_magic.cpp
@@ -31,9 +31,6 @@ along with this program.  If not, see 
<http://www.gnu.org/licenses/>.
 #define EXPORTABLE(x) extern "C" x
 #endif
 
-typedef int (*executePROC)(char*, u_long);
-typedef int (*executeFromFilePROC)(char*);
-
 class MagicHandler : public MimeManagerHandler
 {
 public:
@@ -42,13 +39,13 @@ public:
 
   }
 
-  int load ()
+  virtual int load (const char *resource)
   {
     cookie = magic_open (MAGIC_SYMLINK | MAGIC_MIME_TYPE);
     return magic_load (cookie, NULL);
   }
 
-  virtual ~MagicHandler ()
+  virtual void close ()
   {
     HashMap<string, MimeRecord*>::Iterator it = records.begin ();
     for (; it != records.end (); it++)
@@ -57,6 +54,11 @@ public:
     magic_close (cookie);
   }
 
+  virtual ~MagicHandler ()
+  {
+    close ();
+  }
+
        virtual MimeRecord *getMIME (const char *file)
   {
     MimeRecord *rec = NULL;
@@ -96,6 +98,8 @@ private:
   HashMap<string, MimeRecord*> records;
 };
 
+static MagicHandler *handler;
+
 EXPORTABLE(char*) name (char* name, u_long len)
 {
        char* str = (char*) "mime_magic";
@@ -106,17 +110,18 @@ EXPORTABLE(char*) name (char* name, u_long len)
 
 EXPORTABLE(int) load (void* server)
 {
+  handler = NULL;
        return 0;
 }
 
 EXPORTABLE(int) postLoad(void* server)
 {
   string name ("mime_magic");
-       Server* serverInstance = (Server*)server;
+       Server *serverInstance = (Server*)server;
   MimeManager *mimeManager = serverInstance->getMimeManager ();
 
   MagicHandler *handler = new MagicHandler;
-  if (handler->load ())
+  if (handler->load (NULL))
     {
       serverInstance->log (MYSERVER_LOG_MSG_ERROR,
                                   _("cannot load mime magic configuration"));
@@ -130,5 +135,8 @@ EXPORTABLE(int) postLoad(void* server)
 
 EXPORTABLE(int) unLoad()
 {
+  if (handler)
+    delete handler;
+
        return 0;
 }

-----------------------------------------------------------------------

Summary of changes:
 myserver/include/conf/mime/Makefile.am             |    2 +-
 myserver/include/conf/mime/mime_manager.h          |   43 +--
 .../mime/{mime_manager.h => xml_mime_handler.h}    |   67 ++---
 myserver/include/conf/vhost/vhost.h                |   11 +-
 myserver/include/server/server.h                   |    6 +-
 myserver/src/conf/mime/Makefile.am                 |    2 +-
 myserver/src/conf/mime/mime_manager.cpp            |  312 +-------------------
 .../{mime_manager.cpp => xml_mime_handler.cpp}     |  190 +-----------
 myserver/src/conf/vhost/vhost.cpp                  |   15 +-
 myserver/src/conf/vhost/vhost_manager.cpp          |   24 ++-
 myserver/src/server/server.cpp                     |   19 +-
 plugins/src/mime_magic/mime_magic.cpp              |   22 +-
 12 files changed, 120 insertions(+), 593 deletions(-)
 copy myserver/include/conf/mime/{mime_manager.h => xml_mime_handler.h} (62%)
 copy myserver/src/conf/mime/{mime_manager.cpp => xml_mime_handler.cpp} (66%)


hooks/post-receive
-- 
GNU MyServer




reply via email to

[Prev in Thread] Current Thread [Next in Thread]