pion
5.0.6
|
00001 // --------------------------------------------------------------------- 00002 // pion: a Boost C++ framework for building lightweight HTTP interfaces 00003 // --------------------------------------------------------------------- 00004 // Copyright (C) 2007-2014 Splunk Inc. (https://github.com/splunk/pion) 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 "EchoService.hpp" 00011 #include <boost/bind.hpp> 00012 #include <pion/algorithm.hpp> 00013 #include <pion/http/response_writer.hpp> 00014 #include <pion/user.hpp> 00015 00016 using namespace pion; 00017 00018 namespace pion { // begin namespace pion 00019 namespace plugins { // begin namespace plugins 00020 00021 00023 void writeDictionaryTerm(http::response_writer_ptr& writer, 00024 const ihash_multimap::value_type& val) 00025 { 00026 // text is copied into writer text cache 00027 writer << val.first << http::types::HEADER_NAME_VALUE_DELIMITER 00028 << val.second 00029 << http::types::STRING_CRLF; 00030 } 00031 00032 00033 // EchoService member functions 00034 00036 void EchoService::operator()(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn) 00037 { 00038 // this web service uses static text to test the mixture of "copied" with 00039 // "static" (no-copy) text 00040 static const std::string REQUEST_ECHO_TEXT("[Request Echo]"); 00041 static const std::string REQUEST_HEADERS_TEXT("[Request Headers]"); 00042 static const std::string QUERY_PARAMS_TEXT("[Query Parameters]"); 00043 static const std::string COOKIE_PARAMS_TEXT("[Cookie Parameters]"); 00044 static const std::string POST_CONTENT_TEXT("[POST Content]"); 00045 static const std::string USER_INFO_TEXT("[USER Info]"); 00046 00047 // Set Content-type to "text/plain" (plain ascii text) 00048 http::response_writer_ptr writer(http::response_writer::create(tcp_conn, *http_request_ptr, 00049 boost::bind(&tcp::connection::finish, tcp_conn))); 00050 writer->get_response().set_content_type(http::types::CONTENT_TYPE_TEXT); 00051 00052 // write request information 00053 writer->write_no_copy(REQUEST_ECHO_TEXT); 00054 writer->write_no_copy(http::types::STRING_CRLF); 00055 writer->write_no_copy(http::types::STRING_CRLF); 00056 writer 00057 << "Request method: " 00058 << http_request_ptr->get_method() 00059 << http::types::STRING_CRLF 00060 << "Resource originally requested: " 00061 << http_request_ptr->get_original_resource() 00062 << http::types::STRING_CRLF 00063 << "Resource delivered: " 00064 << http_request_ptr->get_resource() 00065 << http::types::STRING_CRLF 00066 << "Query string: " 00067 << http_request_ptr->get_query_string() 00068 << http::types::STRING_CRLF 00069 << "HTTP version: " 00070 << http_request_ptr->get_version_major() << '.' << http_request_ptr->get_version_minor() 00071 << http::types::STRING_CRLF 00072 << "Content length: " 00073 << (unsigned long)http_request_ptr->get_content_length() 00074 << http::types::STRING_CRLF 00075 << http::types::STRING_CRLF; 00076 00077 // write request headers 00078 writer->write_no_copy(REQUEST_HEADERS_TEXT); 00079 writer->write_no_copy(http::types::STRING_CRLF); 00080 writer->write_no_copy(http::types::STRING_CRLF); 00081 std::for_each(http_request_ptr->get_headers().begin(), http_request_ptr->get_headers().end(), 00082 boost::bind(&writeDictionaryTerm, writer, _1)); 00083 writer->write_no_copy(http::types::STRING_CRLF); 00084 00085 // write query parameters 00086 writer->write_no_copy(QUERY_PARAMS_TEXT); 00087 writer->write_no_copy(http::types::STRING_CRLF); 00088 writer->write_no_copy(http::types::STRING_CRLF); 00089 std::for_each(http_request_ptr->get_queries().begin(), http_request_ptr->get_queries().end(), 00090 boost::bind(&writeDictionaryTerm, writer, _1)); 00091 writer->write_no_copy(http::types::STRING_CRLF); 00092 00093 // write cookie parameters 00094 writer->write_no_copy(COOKIE_PARAMS_TEXT); 00095 writer->write_no_copy(http::types::STRING_CRLF); 00096 writer->write_no_copy(http::types::STRING_CRLF); 00097 std::for_each(http_request_ptr->get_cookies().begin(), http_request_ptr->get_cookies().end(), 00098 boost::bind(&writeDictionaryTerm, writer, _1)); 00099 writer->write_no_copy(http::types::STRING_CRLF); 00100 00101 // write POST content 00102 writer->write_no_copy(POST_CONTENT_TEXT); 00103 writer->write_no_copy(http::types::STRING_CRLF); 00104 writer->write_no_copy(http::types::STRING_CRLF); 00105 if (http_request_ptr->get_content_length() != 0) { 00106 writer->write(http_request_ptr->get_content(), http_request_ptr->get_content_length()); 00107 writer->write_no_copy(http::types::STRING_CRLF); 00108 writer->write_no_copy(http::types::STRING_CRLF); 00109 } 00110 00111 // if authenticated, write user info 00112 user_ptr user = http_request_ptr->get_user(); 00113 if (user) { 00114 writer->write_no_copy(USER_INFO_TEXT); 00115 writer->write_no_copy(http::types::STRING_CRLF); 00116 writer->write_no_copy(http::types::STRING_CRLF); 00117 writer << "User authenticated, username: " << user->get_username(); 00118 writer->write_no_copy(http::types::STRING_CRLF); 00119 } 00120 00121 // send the writer 00122 writer->send(); 00123 } 00124 00125 00126 } // end namespace plugins 00127 } // end namespace pion 00128 00129 00131 extern "C" PION_PLUGIN pion::plugins::EchoService *pion_create_EchoService(void) 00132 { 00133 return new pion::plugins::EchoService(); 00134 } 00135 00137 extern "C" PION_PLUGIN void pion_destroy_EchoService(pion::plugins::EchoService *service_ptr) 00138 { 00139 delete service_ptr; 00140 }