diff options
Diffstat (limited to 'reqp.cpp')
| -rw-r--r--[-rwxr-xr-x] | reqp.cpp | 199 |
1 files changed, 59 insertions, 140 deletions
@@ -4,46 +4,43 @@ #define REQP_CXX #include "reqp.h" -#include "s_chat.h" -#include "s_html.h" -#include "s_mutx.h" -#include "s_sock.h" -#include "s_tool.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 = "Cache-control: no-cache\n"; +string reqp::HTTP_CACHEC = "Cash-control: no-cache\n"; string reqp::HTTP_CONNEC = "Connection: keep-alive\n"; -string reqp::HTTP_COTYPE = "Content-Type: "; +string reqp::HTTP_COTYPE = "Content-Type: text/html\n\n"; reqp::reqp( ) { +#ifdef VERBOSE + cout << "reqp::reqp()" << endl; +#endif } string -reqp::get_url( thrd* p_thrd, string s_req, map_string &map_params ) +reqp::get_url( string s_req, map_string &map_params ) { - auto unsigned int pos; - string s_ret ( "" ); - string s_vars( "" ); - auto int i_request; - - i_request= ( s_req.find("GET",0) != string::npos ) ? RQ_GET : RQ_POST; - - pos = s_req.find( "HTTP", 0 ); +#ifdef VERBOSE_ + pthread_mutex_lock ( &MUTX::get().mut_stdout ); + cout << "reqp::get_url( s_req )" << endl; + pthread_mutex_unlock( &MUTX::get().mut_stdout ); +#endif - if( i_request == RQ_GET ) - s_ret.append( s_req.substr( 5, pos-6 ) ); - else - s_ret.append( s_req.substr( 6, pos-7 ) ); + 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 ); + pos = s_ret.find( "..", 0 ); if ( pos == string::npos ) break; @@ -53,57 +50,37 @@ reqp::get_url( thrd* p_thrd, string s_req, map_string &map_params ) while( true ); // do not add the string behind "?" tp s_ret and add all params behind "?" to map_params. - if( i_request == RQ_GET ) - pos = s_ret.find( "?", 0 ); - else - pos = s_req.find("\r\n\r\n", 0); - - auto string s_params( "" ); + pos = s_ret.find( "?", 0 ); if ( pos != string::npos ) { - if( i_request == RQ_GET ) - s_params.append( s_ret.substr( pos+1, s_ret.length() -pos-1 ) ); - - else - s_params = s_req.substr( pos+4, s_req.length() -pos-1 ); - + auto string s_params = s_ret.substr( pos+1, s_ret.length() -pos-1 ); s_ret = s_ret.substr( 0, pos ); - } - if ( i_request == RQ_POST && s_params.empty() ) - { - char c_req[READBUF]; - read ( p_thrd->get_sock() , c_req, READBUF ); - s_params = string( strstr( c_req, "event" ) ); - } + auto unsigned int pos2; + do + { + pos = s_params.find( "=", 0 ); + if ( pos == string::npos ) + break; - 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; + } - pos2 = s_params.find( "&", 0 ); - if ( pos2 == string::npos ) - { - auto string sValue( s_params.substr(pos+1, s_params.length()-pos-1) ); - auto string tmpstr( url_decode(sValue) ); - map_params[ s_params.substr( 0, pos ) ] = tmpstr; - 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 ); - auto string s_temp= s_params.substr( pos+1, pos2-pos-1 ); - map_params[ s_params.substr( 0, pos ) ] = url_decode(s_temp); - - s_params = s_params.substr( pos2+1, s_params.length()-pos2-1 ); } - while( true ); -#ifdef VERBOSE - pthread_mutex_lock ( &s_mutx::get().mut_stdout ); +#ifdef _VERBOSE + pthread_mutex_lock ( &MUTX::get().mut_stdout ); cout << REQUEST << s_ret << endl; - pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + pthread_mutex_unlock( &MUTX::get().mut_stdout ); #endif map_params["request"] = s_ret; @@ -112,67 +89,14 @@ reqp::get_url( thrd* p_thrd, string s_req, map_string &map_params ) } string -reqp::getContentType( string s_file ) -{ - string s_ext=s_tool::getExtension( s_file ); - - if(s_ext=="") - s_ext="DEFAULT"; - - return s_conf::get().get_val( "CT_"+s_ext ); -} - -int -reqp::htoi(string *s) -{ - int value; - int c; - - c=s->c_str()[0]; - if(isupper(c)) - c=tolower(c); - - value=(c>='0' && c<='9'?c-'0':c-'a'+10)*16; - - c=s->c_str()[1]; - if(isupper(c)) - c=tolower(c); - - value+=c>='0' && c<='9'?c-'0':c-'a'+10; - return value; -} - -string -reqp::url_decode( string s_str ) -{ - auto string sDest=""; - int len = s_str.size(); - - for(int i=0;i<len;i++) - { - char ch = s_str.at(i); - if(ch=='+') - { - sDest+=" "; - } - else if(ch=='%') - { - auto string sTmp=s_str.substr(i+1,2); - ch=(char)htoi(&sTmp); - sDest+=ch; - i+=2; - - } - else - - sDest+=ch; - } - return sDest; -} - -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] ); @@ -182,19 +106,22 @@ reqp::get_from_header( string s_req, string s_hdr ) } string -reqp::parse( thrd* p_thrd, string s_req, map_string &map_params ) +reqp::parse( string s_req, map_string &map_params ) { - - // store all request informations in map_params. store the url in - // map_params["request"]. - get_url( p_thrd, s_req, 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 ); - s_rep.append( getContentType( map_params["request"] ) ); s_rep.append("\n\n"); + // 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"] ); @@ -203,41 +130,33 @@ reqp::parse( thrd* p_thrd, string s_req, map_string &map_params ) // login procedure. if ( s_event == "login" ) { - s_chat::get().login( map_params ); + CHAT::get().login( map_params ); } else { bool b_found; - user* p_user = s_chat::get().get_user( map_params["nick"], 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"] = s_conf::get().get_val( "STARTMPL" ); // redirect to the startpage. + map_params["request"] = CONF::get().get_val( "STARTMPL" ); // redirect to the startpage. } // if a message post. else if ( s_event == "post" ) - s_chat::get().post( p_user, map_params ); - - // if a chat stream - else if ( s_event == "stream" ) - { - string s_msg(s_html::get().parse( map_params ) ); - p_user->msg_post( &s_msg); - s_sock::get().chat_stream( p_thrd->get_sock(), p_user, map_params ); - } + CHAT::get().post( u_user, map_params ); // if a request for the online list of the active room. else if ( s_event == "online" ) - s_html::get().online_list( p_user, map_params ); + 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( s_html::get().parse( map_params ) ); + s_rep.append( HTML::get().parse( map_params ) ); // return the parsed html-template. return s_rep; |
