net/services/CookieService.cpp

00001 // ------------------------------------------------------------------
00002 // pion-net: a C++ framework for building lightweight HTTP interfaces
00003 // ------------------------------------------------------------------
00004 // Copyright (C) 2007-2008 Atomic Labs, Inc.  (http://www.atomiclabs.com)
00005 //
00006 // Distributed under the Boost Software License, Version 1.0.
00007 // See http://www.boost.org/LICENSE_1_0.txt
00008 //
00009 
00010 #include "CookieService.hpp"
00011 #include <pion/net/HTTPResponseWriter.hpp>
00012 
00013 using namespace pion;
00014 using namespace pion::net;
00015 
00016 namespace pion {        // begin namespace pion
00017 namespace plugins {     // begin namespace plugins
00018 
00019     
00020 // CookieService member functions
00021 
00023 void CookieService::operator()(HTTPRequestPtr& request, TCPConnectionPtr& tcp_conn)
00024 {
00025     static const std::string HEADER_HTML = "<html>\n<head>\n<title>Cookie Service</title>\n"
00026         "</head>\n<body>\n\n<h1>Cookie Service</h1>\n";
00027     static const std::string FOOTER_HTML = "\n</body>\n</html>\n";
00028 
00029     // Set Content-type for HTML and write the header
00030     HTTPResponseWriterPtr writer(HTTPResponseWriter::create(tcp_conn, *request,
00031                                                             boost::bind(&TCPConnection::finish, tcp_conn)));
00032     writer->getResponse().setContentType(HTTPTypes::CONTENT_TYPE_HTML);
00033     writer->writeNoCopy(HEADER_HTML);
00034 
00035     // Check if we have an action to perform
00036     if (request->hasQuery("action")) {
00037         if (HTTPTypes::url_decode(request->getQuery("action")) == "Add Cookie") {
00038             // add a new cookie
00039             const std::string cookie_name(request->getQuery("cookie_name"));
00040             const std::string cookie_value(request->getQuery("cookie_value"));
00041             if (cookie_name.empty() || cookie_value.empty()) {
00042                 writer << "\n<p>[Error: You must specify a name and value to add a cookie]</p>\n\n";
00043             } else {
00044                 writer->getResponse().setCookie(cookie_name, cookie_value);
00045                 writer << "\n<p>[Added cookie "
00046                     << cookie_name << '=' << cookie_value << "]</p>\n\n";
00047             }
00048         } else if (request->getQuery("action") == "delete") {
00049             const std::string cookie_name(request->getQuery("cookie_name"));
00050             if (cookie_name.empty()) {
00051                 writer << "\n<p>[Error: You must specify a name to delete a cookie]</p>\n\n";
00052             } else {
00053                 writer->getResponse().deleteCookie(cookie_name);
00054                 writer << "\n<p>[Deleted cookie " << cookie_name << "]</p>\n\n";
00055             }
00056         } else {
00057             writer << "\n<p>[Error: Unrecognized action]</p>\n\n";
00058         }
00059     }
00060     
00061     // display cookie headers in request
00062     if (request->hasHeader(HTTPTypes::HEADER_COOKIE)) {
00063         writer << "\n<h2>Cookie Headers</h2>\n<ul>\n";
00064         std::pair<HTTPTypes::Headers::const_iterator, HTTPTypes::Headers::const_iterator>
00065             header_pair = request->getHeaders().equal_range(HTTPTypes::HEADER_COOKIE);
00066         for (HTTPTypes::Headers::const_iterator header_iterator = header_pair.first;
00067              header_iterator != request->getHeaders().end()
00068              && header_iterator != header_pair.second; ++header_iterator)
00069         {
00070             writer << "<li>Cookie: " << header_iterator->second << "\n";
00071         }
00072         writer << "</ul>\n\n";
00073     } else {
00074         writer << "\n<h2>No Cookie Headers</h2>\n\n";
00075     }
00076     
00077     // display existing cookies
00078     HTTPTypes::CookieParams& cookie_params = request->getCookieParams();
00079     if (! cookie_params.empty()) {
00080         writer << "\n<h2>Cookie Variables</h2>\n<ul>\n";
00081         for (HTTPTypes::CookieParams::const_iterator i = cookie_params.begin();
00082              i != cookie_params.end(); ++i)
00083         {
00084             writer << "<li>" << i->first << ": " << i->second
00085                 << " <a href=\"" << request->getResource()
00086                 << "?action=delete&cookie_name=" << i->first
00087                 << "\">[Delete]</a>\n";
00088         }
00089         writer << "</ul>\n\n";
00090     } else {
00091         writer << "\n<h2>No Cookie Variables</h2>\n\n";
00092     }
00093 
00094     // display form to add a cookie
00095     writer << "\n<h2>Add Cookie</h2>\n"
00096         "<p><form action=\"" << request->getResource() << "\" method=\"POST\">\n"
00097         "Name: <input type=\"text\" name=\"cookie_name\"><br />\n"
00098         "Value: <input type=\"text\" name=\"cookie_value\"><br />\n"
00099         "<input type=\"submit\" name=\"action\" value=\"Add Cookie\"></p>\n"
00100         "</form>\n\n";
00101     
00102     // write the footer
00103     writer->writeNoCopy(FOOTER_HTML);
00104     
00105     // send the writer
00106     writer->send();
00107 }
00108 
00109 
00110 }   // end namespace plugins
00111 }   // end namespace pion
00112 
00113 
00115 extern "C" PION_SERVICE_API pion::plugins::CookieService *pion_create_CookieService(void)
00116 {
00117     return new pion::plugins::CookieService();
00118 }
00119 
00121 extern "C" PION_SERVICE_API void pion_destroy_CookieService(pion::plugins::CookieService *service_ptr)
00122 {
00123     delete service_ptr;
00124 }

Generated on Fri Apr 30 14:48:53 2010 for pion-net by  doxygen 1.4.7