// dump request void dump_request( HttpRequest& req, HttpUrl& url, CSocket& s ) { s.printf( "<br><br><table border width=650>" ); s.printf( "<tr><td>%s</td><td>%s</td></tr>", req.method(), url.file() ); for( HttpRequest::TagsIterator it=req.tags_begin(); it != req.tags_end(); it++ ) { s.printf( "<tr><td><b>%s</b></td>", (*it).first.c_str() ); if( !(*it).second.empty() ) s.printf( "<td>%s</td></tr>", (char*)(*it).second ); } s.printf("</table>" ); // informatiile din url s.printf( "<table border width=650>" ); for( HttpUrl::QueryIterator itr=url.query_begin(); itr != url.query_end(); itr++ ) { s.printf( "<tr><td><b>%s</b></td>", (*itr).first.c_str() ); if( !(*itr).second.empty() ) s.printf( "<td>%s</td></tr>", (char*)(*itr).second ); } s.printf("</table>" ); }
/** This is the main function from the HTTP server. Every new connection from a client is handled here. Here the request from the client is handled. */ void HTTPServer( GN::ClientList&, GN::CSocket & s ) { try { // buffer pentru cererea HTTP char buffer[ MAX_REQUEST_RECEIVE_BUFFER+2 ]; HttpRequest req; // Clasa pentru procesare cerere HTTP HttpUrl url; // Clasa pentru procesare URL HttpResponse r; // Clasa pentru raspunsul HTTP // receptioneaza cerere int ret = s.receive( buffer, MAX_REQUEST_RECEIVE_BUFFER ); buffer[ret]=0; // proceseaza cererea primita req.parse( buffer, ret ); check_for_errors( s, req ); // parse url url.parse( req.url(), WWW_FOLDER ); // Verifica daca exista fisierul FILE * file = fopen( url.file(), "r"); if( !file ) { r.redirect( STD_404_PAGE ); r.send(s); GSTD::CError error( 0, "File not found"); throw error; } fclose(file); // Trimite raspunsul ok - fisierul exista si continutul va fi trimis r.set_status( HTTP_OK ); r.set("Server", "GCWS 1.0"); r.set("Connection","close"); // incarca DLL // seteaza tipul continutului get_content_type( url.ext(), buffer ); r.set("Content-type", buffer ); // trimite raspunsul cu toate campurile setate corespunzator r.send(s); // send file - one buffer at time file = fopen( url.file(), "rb" ); int nb; do { nb = fread( buffer, 1, MAX_REQUEST_RECEIVE_BUFFER, file ); if( nb ) s.send( buffer, nb ); }while( nb ); fclose( file ); // if( url.is_set("debug") ) dump_request( req, url, s ); } catch( GSTD::CError error ) { throw error; } }