From 9cd3ccffd5372dfde3af478e3f832f18db4be3f1 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 6 Apr 2013 13:14:41 +0200 Subject: tagging tags --- ychat-0.1/reqp.cpp | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 ychat-0.1/reqp.cpp (limited to 'ychat-0.1/reqp.cpp') diff --git a/ychat-0.1/reqp.cpp b/ychat-0.1/reqp.cpp new file mode 100644 index 0000000..52de971 --- /dev/null +++ b/ychat-0.1/reqp.cpp @@ -0,0 +1,165 @@ +// class reqp implementation. + +#ifndef REQP_CXX +#define REQP_CXX + +#include "reqp.h" +#include "CHAT.h" +#include "HTML.h" +#include "MUTX.h" + +using namespace std; + +// inititialization of static members. +string reqp::HTTP_CODEOK = "HTTP/1.1 200 OK\n"; +string reqp::HTTP_SERVER = "Server: yChat (Unix)\n"; +string reqp::HTTP_CONTAC = "Contact: www.yChat.org\n"; +string reqp::HTTP_CACHEC = "Cash-control: no-cache\n"; +string reqp::HTTP_CONNEC = "Connection: keep-alive\n"; +string reqp::HTTP_COTYPE = "Content-Type: text/html\n\n"; + +reqp::reqp( ) +{ +#ifdef VERBOSE + cout << "reqp::reqp()" << endl; +#endif +} + +string +reqp::get_url( string s_req, map_string &map_params ) +{ +#ifdef VERBOSE_ + pthread_mutex_lock ( &MUTX::get().mut_stdout ); + cout << "reqp::get_url( s_req )" << endl; + pthread_mutex_unlock( &MUTX::get().mut_stdout ); +#endif + + auto unsigned int pos = s_req.find( "HTTP", 0 ); + string s_ret = s_req.substr( 5, pos-6 ); + + // remove ".." from the request. + do + { + pos = s_ret.find( "..", 0 ); + + if ( pos == string::npos ) + break; + + s_ret.replace( pos, pos+2, "" ); + } + while( true ); + + // do not add the string behind "?" tp s_ret and add all params behind "?" to map_params. + pos = s_ret.find( "?", 0 ); + if ( pos != string::npos ) + { + auto string s_params = s_ret.substr( pos+1, s_ret.length() -pos-1 ); + s_ret = s_ret.substr( 0, pos ); + + auto unsigned int pos2; + do + { + pos = s_params.find( "=", 0 ); + if ( pos == string::npos ) + break; + + pos2 = s_params.find( "&", 0 ); + if ( pos2 == string::npos ) + { + map_params[ s_params.substr( 0, pos ) ] = s_params.substr( pos+1, s_params.length()-pos-1 ); + break; + } + + map_params[ s_params.substr( 0, pos ) ] = s_params.substr( pos+1, pos2-pos-1 ); + s_params = s_params.substr( pos2+1, s_params.length()-pos2-1 ); + } + while( true ); + + } + +#ifdef _VERBOSE + pthread_mutex_lock ( &MUTX::get().mut_stdout ); + cout << REQUEST << s_ret << endl; + pthread_mutex_unlock( &MUTX::get().mut_stdout ); +#endif + + map_params["request"] = s_ret; + + return s_ret; +} + +string +reqp::get_from_header( string s_req, string s_hdr ) +{ +#ifdef VERBOSE_ + pthread_mutex_lock ( &MUTX::get().mut_stdout ); + cout << "reqp::get_from_header( s_req, \"" << s_hdr << "\" )" << endl; + pthread_mutex_unlock( &MUTX::get().mut_stdout ); +#endif + + auto unsigned int pos[2]; + pos[0] = s_req.find( s_hdr, 0 ); + pos[1] = s_req.find( "\n", pos[0] ); + + auto int i_length = s_hdr.length(); + return s_req.substr( pos[0]+i_length, pos[1]-pos[0]-i_length-1 ); +} + +string +reqp::parse( string s_req, map_string &map_params ) +{ +#ifdef VERBOSE_ + pthread_mutex_lock ( &MUTX::get().mut_stdout ); + cout << "reqp::parse( s_req )" << endl; + pthread_mutex_unlock( &MUTX::get().mut_stdout ); +#endif + + // create the http header. + string s_rep( HTTP_CODEOK ); s_rep.append( HTTP_SERVER ); + s_rep.append( HTTP_CONTAC ); s_rep.append( HTTP_CACHEC ); + s_rep.append( HTTP_CONNEC ); s_rep.append( HTTP_COTYPE ); + + // store all request informations in map_params. store the url in + // map_params["request"]. + get_url( s_req, map_params ); + + // check the event variable. + string s_event( map_params["event"] ); + if ( ! s_event.empty() ) + { + // login procedure. + if ( s_event == "login" ) + { + CHAT::get().login( map_params ); + } + + else + { + bool b_found; + user* u_user = CHAT::get().get_user( map_params["nick"], b_found ); + + if ( ! b_found ) + { + map_params["INFO"] = E_NOTONL; + map_params["request"] = CONF::get().get_val( "STARTMPL" ); // redirect to the startpage. + } + + // if a message post. + else if ( s_event == "post" ) + CHAT::get().post( u_user, map_params ); + + // if a request for the online list of the active room. + else if ( s_event == "online" ) + HTML::get().online_list( u_user, map_params ); + } + } + + // parse and get the requested html-template and also use + // the values stored in map_params for %%KEY%% substituations. + s_rep.append( HTML::get().parse( map_params ) ); + + // return the parsed html-template. + return s_rep; +} + +#endif -- cgit v1.2.3