pion-net  4.0.9
CookieService.cpp
1 // ------------------------------------------------------------------
2 // pion-net: a C++ framework for building lightweight HTTP interfaces
3 // ------------------------------------------------------------------
4 // Copyright (C) 2007-2008 Atomic Labs, Inc. (http://www.atomiclabs.com)
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 // See http://www.boost.org/LICENSE_1_0.txt
8 //
9 
10 #include "CookieService.hpp"
11 #include <pion/PionAlgorithms.hpp>
12 #include <pion/net/HTTPResponseWriter.hpp>
13 
14 using namespace pion;
15 using namespace pion::net;
16 
17 namespace pion { // begin namespace pion
18 namespace plugins { // begin namespace plugins
19 
20 
21 // CookieService member functions
22 
24 void CookieService::operator()(HTTPRequestPtr& request, TCPConnectionPtr& tcp_conn)
25 {
26  static const std::string HEADER_HTML = "<html>\n<head>\n<title>Cookie Service</title>\n"
27  "</head>\n<body>\n\n<h1>Cookie Service</h1>\n";
28  static const std::string FOOTER_HTML = "\n</body>\n</html>\n";
29 
30  // Set Content-type for HTML and write the header
31  HTTPResponseWriterPtr writer(HTTPResponseWriter::create(tcp_conn, *request,
32  boost::bind(&TCPConnection::finish, tcp_conn)));
33  writer->getResponse().setContentType(HTTPTypes::CONTENT_TYPE_HTML);
34  writer->writeNoCopy(HEADER_HTML);
35 
36  // Check if we have an action to perform
37  if (request->hasQuery("action")) {
38  if (algo::url_decode(request->getQuery("action")) == "Add Cookie") {
39  // add a new cookie
40  const std::string cookie_name(request->getQuery("cookie_name"));
41  const std::string cookie_value(request->getQuery("cookie_value"));
42  if (cookie_name.empty() || cookie_value.empty()) {
43  writer << "\n<p>[Error: You must specify a name and value to add a cookie]</p>\n\n";
44  } else {
45  writer->getResponse().setCookie(cookie_name, cookie_value);
46  writer << "\n<p>[Added cookie "
47  << cookie_name << '=' << cookie_value << "]</p>\n\n";
48  }
49  } else if (request->getQuery("action") == "delete") {
50  const std::string cookie_name(request->getQuery("cookie_name"));
51  if (cookie_name.empty()) {
52  writer << "\n<p>[Error: You must specify a name to delete a cookie]</p>\n\n";
53  } else {
54  writer->getResponse().deleteCookie(cookie_name);
55  writer << "\n<p>[Deleted cookie " << cookie_name << "]</p>\n\n";
56  }
57  } else {
58  writer << "\n<p>[Error: Unrecognized action]</p>\n\n";
59  }
60  }
61 
62  // display cookie headers in request
63  if (request->hasHeader(HTTPTypes::HEADER_COOKIE)) {
64  writer << "\n<h2>Cookie Headers</h2>\n<ul>\n";
65  std::pair<HTTPTypes::Headers::const_iterator, HTTPTypes::Headers::const_iterator>
66  header_pair = request->getHeaders().equal_range(HTTPTypes::HEADER_COOKIE);
67  for (HTTPTypes::Headers::const_iterator header_iterator = header_pair.first;
68  header_iterator != request->getHeaders().end()
69  && header_iterator != header_pair.second; ++header_iterator)
70  {
71  writer << "<li>Cookie: " << header_iterator->second << "\n";
72  }
73  writer << "</ul>\n\n";
74  } else {
75  writer << "\n<h2>No Cookie Headers</h2>\n\n";
76  }
77 
78  // display existing cookies
79  HTTPTypes::CookieParams& cookie_params = request->getCookieParams();
80  if (! cookie_params.empty()) {
81  writer << "\n<h2>Cookie Variables</h2>\n<ul>\n";
82  for (HTTPTypes::CookieParams::const_iterator i = cookie_params.begin();
83  i != cookie_params.end(); ++i)
84  {
85  writer << "<li>" << i->first << ": " << i->second
86  << " <a href=\"" << request->getResource()
87  << "?action=delete&cookie_name=" << i->first
88  << "\">[Delete]</a>\n";
89  }
90  writer << "</ul>\n\n";
91  } else {
92  writer << "\n<h2>No Cookie Variables</h2>\n\n";
93  }
94 
95  // display form to add a cookie
96  writer << "\n<h2>Add Cookie</h2>\n"
97  "<p><form action=\"" << request->getResource() << "\" method=\"POST\">\n"
98  "Name: <input type=\"text\" name=\"cookie_name\"><br />\n"
99  "Value: <input type=\"text\" name=\"cookie_value\"><br />\n"
100  "<input type=\"submit\" name=\"action\" value=\"Add Cookie\"></p>\n"
101  "</form>\n\n";
102 
103  // write the footer
104  writer->writeNoCopy(FOOTER_HTML);
105 
106  // send the writer
107  writer->send();
108 }
109 
110 
111 } // end namespace plugins
112 } // end namespace pion
113 
114 
116 extern "C" PION_SERVICE_API pion::plugins::CookieService *pion_create_CookieService(void)
117 {
118  return new pion::plugins::CookieService();
119 }
120 
122 extern "C" PION_SERVICE_API void pion_destroy_CookieService(pion::plugins::CookieService *service_ptr)
123 {
124  delete service_ptr;
125 }
StringDictionary CookieParams
data type for HTTP cookie parameters
Definition: HTTPTypes.hpp:103
static std::string url_decode(const std::string &str)
escapes URL-encoded strings (a%20value+with%20spaces)