Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r60158 - in sandbox/SOC/2007/cgi/trunk: boost/cgi boost/cgi/cgi boost/cgi/common boost/cgi/utility libs/cgi/example/cgi/cookies libs/cgi/example/cgi/sessions libs/cgi/example/fcgi/file_browser libs/cgi/example/scgi
From: lists.drrngrvy_at_[hidden]
Date: 2010-03-04 18:36:34


Author: drrngrvy
Date: 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
New Revision: 60158
URL: http://svn.boost.org/trac/boost/changeset/60158

Log:
More work on experimental session support. See the cgi/sessions example. Tested on ubuntu with g++ 4.3.3.
Added:
   sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/Jamfile.v2 (contents, props changed)
   sandbox/SOC/2007/cgi/trunk/libs/cgi/example/fcgi/file_browser/Jamfile.v2 (contents, props changed)
Removed:
   sandbox/SOC/2007/cgi/trunk/libs/cgi/example/scgi/
Text files modified:
   sandbox/SOC/2007/cgi/trunk/boost/cgi/basic_request.hpp | 68 +++++++++++++++++++++++++--------------
   sandbox/SOC/2007/cgi/trunk/boost/cgi/cgi/request_service.hpp | 2
   sandbox/SOC/2007/cgi/trunk/boost/cgi/common/basic_protocol_service.hpp | 40 +++++++++--------------
   sandbox/SOC/2007/cgi/trunk/boost/cgi/common/commit.hpp | 4 +-
   sandbox/SOC/2007/cgi/trunk/boost/cgi/common/parse_options.hpp | 6 +++
   sandbox/SOC/2007/cgi/trunk/boost/cgi/common/protocol_traits.hpp | 5 ++
   sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_base.hpp | 59 +++++++++++++++++++++++++++++++++-
   sandbox/SOC/2007/cgi/trunk/boost/cgi/utility/sessions.hpp | 35 ++++++++++++++++++-
   sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/Jamfile.v2 | 1
   sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/main.cpp | 1
   sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/main.cpp | 41 ++++++++++++++++++-----
   11 files changed, 196 insertions(+), 66 deletions(-)

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/basic_request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/basic_request.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/basic_request.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -50,17 +50,16 @@
 #endif
 
 BOOST_CGI_NAMESPACE_BEGIN
-
  namespace common {
 
- /// Get a hashed interpretation of the request.
- /**
- * You cannot consider this completely unique to each
- * request, but it should be quite useful anyway.
- * You can use this for logging or tracking, for example.
- */
- template<typename P>
- std::size_t hash_value(basic_request<P> const& req);
+ /// Get a hashed interpretation of the request.
+ /**
+ * You cannot consider this completely unique to each
+ * request, but it should be quite useful anyway.
+ * You can use this for logging or tracking, for example.
+ */
+ template<typename P>
+ std::size_t hash_value(basic_request<P> const& req);
 
   /// The basic_request class, primary entry point to the library
   /**
@@ -98,7 +97,6 @@
 #ifdef BOOST_CGI_ENABLE_SESSIONS
     typedef typename traits::session_type session_type;
 
- string_type session_id_;
     session_type session;
 #endif // BOOST_CGI_ENABLE_SESSIONS
     
@@ -114,6 +112,7 @@
       , char** base_env = NULL)
         : detail::basic_io_object<service_type>()
     {
+ set_protocol_service();
       if ((parse_options)opts > parse_none) load((parse_options)opts, base_env);
     }
 
@@ -122,6 +121,7 @@
       , char** base_env = NULL)
         : detail::basic_io_object<service_type>()
     {
+ set_protocol_service();
       if (opts > parse_none) load(opts, base_env);
     }
 
@@ -131,6 +131,7 @@
                  , char** base_env = NULL)
       : detail::basic_io_object<service_type>()
     {
+ set_protocol_service();
       if (opts > parse_none) load(opts, ec);
     }
 
@@ -183,18 +184,23 @@
       // close(http::internal_server_error, 0);
 #ifdef BOOST_CGI_ENABLE_SESSIONS
       try {
- if (!session_id_.empty())
- {
- if (session.id().empty())
- session.id(session_id_);
- this->implementation.service_->save(session);
- }
+ if (!session.id().empty())
+ this->service.session_manager().save(session);
       } catch(...) {
          // pass
       }
 #endif // BOOST_CGI_ENABLE_SESSIONS
     }
     
+#ifdef BOOST_CGI_ENABLE_SESSIONS
+ void start_session()
+ {
+ std::cerr<< "Starting session" << std::endl;
+ if (session.id().empty())
+ session.id(this->service.make_session_id());
+ std::cerr<< "Started session" << std::endl;
+ }
+#endif // BOOST_CGI_ENABLE_SESSIONS
     protocol_service_type& get_protocol_service()
     {
       return *(this->implementation.service_);
@@ -210,6 +216,11 @@
       return pointer(new self_type());
     }
 
+ void set_protocol_service()
+ {
+ //this->service.set_service(this->implementation, ps);
+ }
+
     void set_protocol_service(protocol_service_type& ps)
     {
       this->service.set_service(this->implementation, ps);
@@ -281,11 +292,6 @@
         }
         if (parse_opts & parse_cookies) {
           cookies.set(cookie_vars(this->implementation.vars_));
-#ifdef BOOST_CGI_ENABLE_SESSIONS
- if (cookies.count("$ssid")) {
- session_id_ = cookies["$ssid"];
- }
-#endif // BOOST_CGI_ENABLE_SESSIONS
         }
         if (parse_opts & parse_form_only)
         {
@@ -296,10 +302,24 @@
           );
         }
 #ifdef BOOST_CGI_ENABLE_SESSIONS
- if (!session_id_.empty())
+ if (parse_opts & parse_session_only)
         {
- session.id(session_id_);
- this->implementation.service_->load(session);
+ if (!!cookies && cookies.count("$ssid"))
+ {
+ std::cerr<< "Loading pre-existing session." << std::endl;
+ session.id(cookies["$ssid"]);
+ }
+ else
+ if (traits::auto_start_session)
+ {
+ std::cerr<< "Starting new session." << std::endl;
+ session.id(this->service.make_session_id());
+ }
+ if (!session.id().empty())
+ {
+ this->service.session_manager().load(session);
+ std::cerr<< "Started session" << std::endl;
+ }
         }
 #endif // BOOST_CGI_ENABLE_SESSIONS
       }

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/cgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/cgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/cgi/request_service.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -98,7 +98,7 @@
     void construct(implementation_type& impl)
     {
       impl.client_.set_connection(
- implementation_type::connection_type::create(this->get_io_service())
+ connection_type::create(this->get_io_service())
       );
     }
 

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/common/basic_protocol_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/common/basic_protocol_service.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/common/basic_protocol_service.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -22,9 +22,6 @@
 #include "boost/cgi/fwd/basic_request_fwd.hpp"
 #include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
 #include "boost/cgi/import/io_service.hpp"
-#ifdef BOOST_CGI_ENABLE_SESSIONS
-# include "boost/cgi/utility/sessions.hpp"
-#endif // BOOST_CGI_ENABLE_SESSIONS
 
 BOOST_CGI_NAMESPACE_BEGIN
  namespace common {
@@ -41,22 +38,34 @@
     typedef Protocol protocol_type;
     typedef IoServiceProvider ios_provider_type;
     typedef typename protocol_traits<Protocol>::type traits;
+ typedef typename traits::string_type string_type;
     typedef typename traits::request_type request_type;
     typedef typename request_type::pointer request_ptr;
     typedef std::set<request_ptr> set_type;
     typedef std::queue<request_ptr> queue_type;
-#ifdef BOOST_CGI_ENABLE_SESSIONS
- typedef typename traits::session_manager_type session_manager_type;
-#endif // BOOST_CGI_ENABLE_SESSIONS
+
+ basic_protocol_service()
+ : ios_provider_()
+ , request_set_()
+ , request_queue_()
+ {
+ std::cerr<< "Constructing" << std::endl;
+ }
 
     basic_protocol_service(int pool_size_hint = 1)
       : ios_provider_(pool_size_hint)
+ , request_set_()
+ , request_queue_()
     {
+ std::cerr<< "2.. Constructing" << std::endl;
     }
 
     basic_protocol_service(boost::asio::io_service& ios)
       : ios_provider_(ios)
+ , request_set_()
+ , request_queue_()
     {
+ std::cerr<< "3... Constructing" << std::endl;
     }
 
     ~basic_protocol_service()
@@ -80,7 +89,6 @@
      */
     void stop()
     {
- //gateway_.stop();
       ios_provider_.stop();
     }
 
@@ -107,7 +115,7 @@
      * The order in which the underlying io_services are returned is determined
      * by what policy the IoServiceProvider uses.
      */
- ::BOOST_CGI_NAMESPACE::common::io_service& io_service()
+ ::BOOST_CGI_NAMESPACE::common::io_service& get_io_service()
     {
       return ios_provider_.get_io_service();
     }
@@ -126,22 +134,6 @@
       ios_provider_.get_io_service().dispatch(handler);
     }
 
-#ifdef BOOST_CGI_ENABLE_SESSIONS
- template<typename T>
- void save(basic_session<T>& sesh) {
- session_mgr_.save(sesh);
- }
-
- template<typename T>
- void load(basic_session<T>& sesh) {
- session_mgr_.load(sesh);
- }
-
- private:
- session_manager_type session_mgr_;
-
-#endif // BOOST_CGI_ENABLE_SESSIONS
-
   private:
     ios_provider_type ios_provider_;
 

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/common/commit.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/common/commit.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/common/commit.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -29,8 +29,8 @@
               , boost::system::error_code& ec)
     {
 #ifdef BOOST_CGI_ENABLE_SESSIONS
- if (!req.session_id_.empty()) {
- resp<< cookie("$ssid", req.session_id_);
+ if (!req.session.id().empty()) {
+ resp<< cookie("$ssid", req.session.id());
       }
 #endif // BOOST_CGI_ENABLE_SESSIONS
       resp.send(req.client(), ec);

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/common/parse_options.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/common/parse_options.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/common/parse_options.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -23,7 +23,13 @@
      , parse_cookie = parse_cookie_only | parse_env
      , parse_cookies_only = parse_cookie_only
      , parse_cookies = parse_cookies_only | parse_env
+#ifdef BOOST_CGI_ENABLE_SESSIONS
+ , parse_session_only = 16
+ , parse_session = parse_session_only | parse_cookies
+ , parse_all = parse_env | parse_form | parse_cookie | parse_session
+#else
      , parse_all = parse_env | parse_form | parse_cookie
+#endif // BOOST_CGI_ENABLE_SESSIONS
    };
 
  } // namespace common

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/common/protocol_traits.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/common/protocol_traits.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/common/protocol_traits.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -24,6 +24,7 @@
 #include "boost/cgi/fwd/form_parser_fwd.hpp"
 #ifdef BOOST_CGI_ENABLE_SESSIONS
 # include "boost/cgi/utility/sessions.hpp"
+# include <boost/uuid/uuid_generators.hpp>
 #endif // BOOST_CGI_ENABLE_SESSIONS
 
 BOOST_CGI_NAMESPACE_BEGIN
@@ -96,6 +97,9 @@
                 std::map<string_type, string_type>
> session_type;
       typedef session_manager session_manager_type;
+ static const bool auto_start_session = true;
+
+ typedef boost::uuids::random_generator uuid_generator_type;
 #endif // BOOST_CGI_ENABLE_SESSIONS
       static const common::parse_options parse_opts = common::parse_all;
     };
@@ -145,6 +149,7 @@
                 std::map<string_type, string_type>
> session_type;
       typedef session_manager session_manager_type;
+ static const bool auto_start_session = true;
 #endif // BOOST_CGI_ENABLE_SESSIONS
 
       static const common::parse_options parse_opts = common::parse_none;

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_base.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_base.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -28,6 +28,12 @@
 #include "boost/cgi/detail/extract_params.hpp"
 #include "boost/cgi/detail/save_environment.hpp"
 #include "boost/cgi/config.hpp"
+#ifdef BOOST_CGI_ENABLE_SESSIONS
+# include "boost/cgi/utility/sessions.hpp"
+# include <boost/uuid/uuid.hpp>
+# include <boost/uuid/uuid_generators.hpp>
+# include <boost/uuid/uuid_io.hpp>
+#endif // BOOST_CGI_ENABLE_SESSIONS
 
 BOOST_CGI_NAMESPACE_BEGIN
  namespace common {
@@ -42,7 +48,25 @@
   {
   public:
     typedef common::request_base<Protocol> base_type;
+ typedef Protocol protocol_type;
+ typedef protocol_traits<Protocol> traits;
+ typedef typename traits::buffer_type buffer_type;
+ typedef typename traits::char_type char_type;
+ typedef typename traits::client_type client_type;
+ typedef typename traits::connection_type connection_type;
+ typedef typename traits::const_buffers_type const_buffers_type;
+ typedef typename traits::form_parser_type form_parser_type;
+ typedef typename traits::mutable_buffers_type mutable_buffers_type;
+ typedef typename traits::protocol_service_type protocol_service_type;
+ typedef typename traits::request_type request_type;
+ typedef typename traits::string_type string_type;
+ typedef typename connection_type::pointer conn_ptr;
+#ifdef BOOST_CGI_ENABLE_SESSIONS
+ typedef typename traits::uuid_generator_type uuid_generator_type;
+ typedef typename traits::session_manager_type session_manager_type;
+#endif // BOOST_CGI_ENABLE_SESSIONS
 
+
   protected:
     // impl_base is the common base class for all request types'
     // implementation_type and should be inherited by it.
@@ -62,7 +86,7 @@
       typedef typename traits::request_type request_type;
       typedef typename traits::string_type string_type;
       typedef typename connection_type::pointer conn_ptr;
-
+
       /**
        * If you want to add a new data type to a request you need to:
        * > Update this file (just below)
@@ -170,7 +194,8 @@
         bool is_command_line
       )
     {
- if (is_command_line) ++base_environment;
+ if (is_command_line && base_environment != NULL)
+ ++base_environment;
       detail::save_environment(env_vars(impl.vars_), base_environment);
     }
 
@@ -353,6 +378,36 @@
       }
       return ec;
     }
+
+#ifdef BOOST_CGI_ENABLE_SESSIONS
+ public:
+ /// Get the session manager.
+ session_manager_type& session_manager() { return session_mgr_; }
+ /// Get the session manager.
+ session_manager_type const& session_manager() const { return session_mgr_; }
+
+ /// Get a new UUID as a string, suitable as a session id.
+ string_type make_session_id()
+ {
+ string_type val;
+ try {
+ val = boost::lexical_cast<string_type>(make_uuid());
+ } catch (...) {
+ std::cerr<< "Caught error." << std::endl;
+ }
+ return val;
+ }
+
+ /// Generate a new UUID.
+ boost::uuids::uuid make_uuid() { return generator_(); }
+
+ private:
+ session_manager_type session_mgr_;
+ uuid_generator_type generator_;
+
+#endif // BOOST_CGI_ENABLE_SESSIONS
+
+
   };
 
  } // namespace common

Modified: sandbox/SOC/2007/cgi/trunk/boost/cgi/utility/sessions.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/boost/cgi/utility/sessions.hpp (original)
+++ sandbox/SOC/2007/cgi/trunk/boost/cgi/utility/sessions.hpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -20,6 +20,28 @@
 #include "boost/cgi/detail/throw_error.hpp"
 ///////////////////////////////////////////////////////////
 
+/// The directory to store sessions in.
+/**
+ * Your web server will need read and write permissions to this directory.
+ * You are responsible for ensuring that no other users are able to access
+ * files in this directory!
+ *
+ * Session support is currently experimental and relatively dumb.
+ *
+ * A file is saved for every user, containing the session data.
+ * The session data itself defaults to a std::map<string,string>, which
+ * is derived from the ProtocolTraits of the request.
+ *
+ * Look at the `sessions` example to see how to use your own types
+ * for sessions. In general, the idea is that any type that is both
+ * DefaultConstructable and also Serializable (as defined by
+ * Boost.Serialization) can be used as the session type with no runtime
+ * overhead.
+ */
+#ifndef BOOST_CGI_SESSIONS_DIRECTORY
+# define BOOST_CGI_SESSIONS_DIRECTORY "../sessions/"
+#endif // BOOST_CGI_SESSIONS_DIRECTORY
+
 BOOST_CGI_NAMESPACE_BEGIN
  namespace common {
 
@@ -47,15 +69,19 @@
     : T(t)
     , id_(id)
   {}
-
+
   string const& id () const { return id_; }
   void id (string const& new_id) { id_ = new_id; }
   
   operator T() { return static_cast<T&>(*this); }
   operator T() const { return static_cast<T const&>(*this); }
 
+ bool const& loaded() const { return loaded_; }
+ void loaded(bool status) { loaded_ = status; }
+
 private:
   string id_;
+ bool loaded_;
 };
 
 class session_manager
@@ -67,7 +93,8 @@
   template<typename T>
   void save(basic_session<T>& sesh)
   {
- ofstream ofs((sesh.id() + ".arc").c_str());
+ ofstream ofs(
+ (std::string(BOOST_CGI_SESSIONS_DIRECTORY) + sesh.id() + ".arc").c_str());
     if (ofs) {
       boost::archive::text_oarchive archive(ofs);
       archive<< static_cast<typename basic_session<T>::value_type&>(sesh);
@@ -77,10 +104,12 @@
   template<typename T>
   void load(basic_session<T>& sesh)
   {
- ifstream ifs((sesh.id() + ".arc").c_str());
+ ifstream ifs(
+ (std::string(BOOST_CGI_SESSIONS_DIRECTORY) + sesh.id() + ".arc").c_str());
     if (ifs) {
       boost::archive::text_iarchive archive(ifs);
       archive>> static_cast<typename basic_session<T>::value_type&>(sesh);
+ sesh.loaded(true);
     }
   }
 };

Modified: sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/Jamfile.v2 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -10,6 +10,7 @@
   :
      main.cpp /boost/regex/ /boost/cgi/
   :
+ <linkflags>-lctemplate
   ;
 
 

Modified: sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/main.cpp (original)
+++ sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/cookies/main.cpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -20,7 +20,6 @@
 // [1] - http://code.google.com/p/google-ctemplate/
 //
 #include <boost/cgi/cgi.hpp>
-#include <boost/cgi/utility.hpp>
 #include <ctemplate/template.h>
 #include <boost/throw_exception.hpp>
 #include <boost/system/system_error.hpp>

Added: sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/Jamfile.v2 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -0,0 +1,29 @@
+# Copyright (c) 2009 Darren Garvey
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy
+# at http://www.boost.org/LICENSE_1_0.txt)
+
+project boost/cgi/example/cgi/sesssions ;
+
+exe cgi_sessions
+ :
+ main.cpp
+ :
+ <define>BOOST_CGI_ENABLE_SESSIONS
+ <library>/boost/cgi/
+ <library>/boost/filesystem/
+ <library>/boost/serialization/
+ ;
+
+
+# Our install rule (builds binaries and copies them to <location>)
+install install
+ :
+ cgi_sessions
+ :
+ <location>$(cgi-bin)
+ ;
+
+# Only install example if you use `bjam install' or equivalent
+explicit install ;

Modified: sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/main.cpp (original)
+++ sandbox/SOC/2007/cgi/trunk/libs/cgi/example/cgi/sessions/main.cpp 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -20,30 +20,56 @@
   
 };
 
+/*<
+ * Now we can override the default session type to use the `context` class.
+ *
+ * To do this we need to create a `Tag`. A `Tag` is a plain struct used as
+ * an identifier. If we specialise the `protocol_traits<>` template for this
+ * tag we can change the behaviour of the library at compile-time.
+ *
+ * In this example we are just going to override the actual `session_type`
+ * and otherwise inherit the properties for CGI.
+>*/
+
+/// The `Tag`
 struct session_enabled_cgi {};
 
-namespace boost { namespace cgi {
+/// Specialise the `protocol_traits` template in the `boost::cgi::common`
+/// namespace.
+namespace boost { namespace cgi { namespace common {
 
 template<>
 struct protocol_traits<session_enabled_cgi>
   : protocol_traits<boost::cgi::tags::cgi>
 {
   typedef basic_session<context> session_type;
+ static const bool auto_start_session = false;
 };
 
-} } // namespace boost::cgi
+} } } // namespace boost::cgi::common
 
 using namespace boost::cgi;
 
+/// Define a request type which uses the traits for our
+/// `session_enabled_cgi` Tag.
 typedef basic_request<session_enabled_cgi> my_request;
 
 int main(int, char**)
 {
+ cerr<< "Started: " << time(NULL) << endl;
   try
   {
+ boost::uuids::basic_random_generator<boost::rand48> generator;
+ cerr<< "Here" << endl;
+ boost::uuids::uuid u = generator();
+ cerr<< "generated" << endl;
+
+
     my_request req;
     response resp;
 
+ //req.load(parse_session);
+
     resp<< "one = " << req.session.data["one"]
         << ", two = " << req.session.data["two"]
         << ", ten = " << req.session.data["ten"];
@@ -54,20 +80,17 @@
     req.session.data["ten"] = 10;
 
     // Set the session id, so the data is saved.
- req.session_id_ = "1";
+ //req.session_id_ = "1";
 
     resp<< content_type("text/plain") << "\nBlah\n";
     
     commit(req, resp);
 
- cout<< "Press enter to continue...";
- //cin.get();
     return 0;
   
   } catch (std::exception& e) {
     cerr<< "Error: " << e.what() << endl;
   }
-
- cout<< "Press enter to continue...";
- cin.get();
-}
\ No newline at end of file
+
+ cout<< "Content-type: text/html\r\n\r\nBoom";
+}

Added: sandbox/SOC/2007/cgi/trunk/libs/cgi/example/fcgi/file_browser/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/cgi/trunk/libs/cgi/example/fcgi/file_browser/Jamfile.v2 2010-03-04 18:36:33 EST (Thu, 04 Mar 2010)
@@ -0,0 +1,21 @@
+# Copyright (c) 2009 Darren Garvey
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy
+# at http://www.boost.org/LICENSE_1_0.txt)
+
+project boost/cgi/example/fcgi/file_browser ;
+
+exe fcgi_file_browser : main.cpp /boost/regex/ ;
+
+# Our install rule (builds binaries and copies them to <location>)
+install install
+ :
+ fcgi_file_browser
+ :
+ <location>$(fcgi-bin)
+ ;
+
+# Only install example if you use `bjam install' or equivalent
+explicit install ;
+


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk