// class reqp implementation. #ifndef REQP_CXX #define REQP_CXX #include "reqp.h" #include "CHAT.h" #include "HTML.h" #include "MUTX.h" #include "sock.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( ) { } string reqp::get_url( thrd* p_thrd, 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 ); if( i_request == RQ_GET ) s_ret.append( s_req.substr( 5, pos-6 ) ); else s_ret.append( s_req.substr( 6, pos-7 ) ); // 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. if( i_request == RQ_GET ) pos = s_ret.find( "?", 0 ); else pos = s_req.find("\r\n\r\n", 0); auto string s_params( "" ); 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 ); 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; 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; } 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 ( &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; } 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