HTTPCookie::HTTPCookie(const NameValueCollection& nvc): _version(0), _secure(false), _maxAge(-1), _httpOnly(false) { for (NameValueCollection::ConstIterator it = nvc.begin(); it != nvc.end(); ++it) { const std::string& name = it->first; const std::string& value = it->second; if (icompare(name, "comment") == 0) { setComment(value); } else if (icompare(name, "domain") == 0) { setDomain(value); } else if (icompare(name, "path") == 0) { setPath(value); } else if (icompare(name, "priority") == 0) { setPriority(value); } else if (icompare(name, "max-age") == 0) { throw NotImplementedException("HTTPCookie::HTTPCookie max-age"); } else if (icompare(name, "secure") == 0) { setSecure(true); } else if (icompare(name, "expires") == 0) { throw NotImplementedException("HTTPCookie::HTTPCookie expires"); } else if (icompare(name, "version") == 0) { throw NotImplementedException("HTTPCookie::HTTPCookie version"); } else if (icompare(name, "HttpOnly") == 0) { setHttpOnly(true); } else { setName(name); setValue(value); } } }
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) { HTMLForm form(request, request.stream()); response.setContentType("text/html"); response.setChunkedTransferEncoding(true); std::ostream& ostr = response.send(); URI requestURI(request.getURI()); ostr << "<html><head><title>Echo HTTP Headers and HTML Form Information</title>" "<link rel=\"stylesheet\" href=\"css/styles.css\" type=\"text/css\"/></head><body>" "<div class=\"header\">" "<h1 class=\"category\">Open Service Platform</h1>" "<h1 class=\"title\">Echo HTTP Headers and HTML Form Information</H1>" "</div>" "<div class=\"body\">"; // echo the items available by method ostr << "<h2>Request</h2>" << "<ul>" << "<li><b>Method:</b> " << request.getMethod() << "</li>" << "<li><b>URI Path:</b> " << requestURI.getPath() << "</li>" << "<li><b>URI Query:</b> " << requestURI.getQuery() << "</li>" << "<li><b>HTTP Version:</b> " << request.getVersion() << "</li>" << "<li><b>Host:</b> " << request.getHost() << "</li>" << "<li><b>Content Type:</b> " << request.getContentType() << "</li>" << "<li><b>Chunked:</b> " << (request.getChunkedTransferEncoding() ? "true" : "false") << "</li>" << "<li><b>Keep Alive:</b> " << (request.getKeepAlive() ? "true" : "false") << "</li>" << "<li><b>Transfer Encoding:</b> " << request.getTransferEncoding() << "</li>" << "<li><b>Client Address:</b> " << request.clientAddress().toString() << "</li>"; if (request.hasContentLength()) { ostr << "<li><b>Content Length:</b> " << request.getContentLength64() << "</li>"; } ostr << "</ul>"; // echo the request headers { ostr << "<hr>" "<h2>Request Headers</h2><ul>\n"; NameValueCollection headers; NameValueCollection::ConstIterator itr(request.begin()); NameValueCollection::ConstIterator itrEnd(request.end()); for (; itr != itrEnd; ++itr) { ostr << "<li><b>" << htmlize(itr->first) << "</b>: " << htmlize(itr->second) << "</li>"; } ostr << "</ul>"; } // echo any cookies { NameValueCollection cookies; request.getCookies(cookies); if (!cookies.empty()) { ostr << "<hr>"; ostr << "<h2>Cookies</h2><ul>\n"; NameValueCollection::ConstIterator itr(cookies.begin()); NameValueCollection::ConstIterator itrEnd(cookies.end()); for (; itr != itrEnd; ++itr) { ostr << "<li><b>" << htmlize(itr->first) << "</b>: " << htmlize(itr->second) << "</li>"; } ostr << "</ul>"; } } // echo any form data (GETs or POSTs) if (!form.empty()) { ostr << "<hr>" "<h2>Form Data</h2><ul>\n"; NameValueCollection::ConstIterator itr(form.begin()); NameValueCollection::ConstIterator itrEnd(form.end()); for (; itr != itrEnd; ++itr) { ostr << "<li><b>" << htmlize(itr->first) << "</b>: " << htmlize(itr->second) << "</li>\n"; } ostr << "</ul>"; } ostr << "<hr>" << "<h2>Response</h2>" << "<ul>" << "<li><b>Status:</b> " << response.getStatus() << "</li>" << "<li><b>Reason:</b> " << response.getReason() << "</li>" << "</ul>"; // echo the response headers { ostr << "<hr>" "<h2>Response Headers</h2><ul>\n"; NameValueCollection headers; NameValueCollection::ConstIterator itr(response.begin()); NameValueCollection::ConstIterator itrEnd(response.end()); for (; itr != itrEnd; ++itr) { ostr << "<li><b>" << htmlize(itr->first) << "</b>: " << htmlize(itr->second) << "</li>"; } ostr << "</ul>"; } ostr << "</div></body></html>"; }
void NameValueCollectionTest::testNameValueCollection() { NameValueCollection nvc; assert (nvc.empty()); assert (nvc.size() == 0); nvc.set("name", "value"); assert (!nvc.empty()); assert (nvc["name"] == "value"); assert (nvc["Name"] == "value"); nvc.set("name2", "value2"); assert (nvc.get("name2") == "value2"); assert (nvc.get("NAME2") == "value2"); assert (nvc.size() == 2); try { std::string value = nvc.get("name3"); fail("not found - must throw"); } catch (NotFoundException&) { } try { std::string value = nvc["name3"]; fail("not found - must throw"); } catch (NotFoundException&) { } assert (nvc.get("name", "default") == "value"); assert (nvc.get("name3", "default") == "default"); assert (nvc.has("name")); assert (nvc.has("name2")); assert (!nvc.has("name3")); nvc.add("name3", "value3"); assert (nvc.get("name3") == "value3"); nvc.add("name3", "value31"); NameValueCollection::ConstIterator it = nvc.find("Name3"); assert (it != nvc.end()); std::string v1 = it->second; assert (it->first == "name3"); ++it; assert (it != nvc.end()); std::string v2 = it->second; assert (it->first == "name3"); assert ((v1 == "value3" && v2 == "value31") || (v1 == "value31" && v2 == "value3")); nvc.erase("name3"); assert (!nvc.has("name3")); assert (nvc.find("name3") == nvc.end()); it = nvc.begin(); assert (it != nvc.end()); ++it; assert (it != nvc.end()); ++it; assert (it == nvc.end()); nvc.clear(); assert (nvc.empty()); assert (nvc.size() == 0); }