1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
/*
* Modification History
*
* 2002-March-12 Jason Rohrer
* Created.
*
* 2002-April-5 Jason Rohrer
* Changed to extend StopSignalThread.
* Added timeouts to socket accept to support checking for stop signal.
*
* 2002-August-2 Jason Rohrer
* Added use of ConnectionPermissionHandler.
*
* 2002-August-6 Jason Rohrer
* Changed member init order.
*
* 2002-September-17 Jason Rohrer
* Removed argument to ConnectionPermissionHandler constructor.
*
* 2003-September-5 Jason Rohrer
* Moved into minorGems.
*/
#include "WebServer.h"
#include "minorGems/util/log/AppLog.h"
WebServer::WebServer( int inPort, PageGenerator *inGenerator )
: mPortNumber( inPort ), mMaxQueuedConnections( 100 ),
mThreadHandler( new ThreadHandlingThread() ),
mPageGenerator( inGenerator ),
mConnectionPermissionHandler( new ConnectionPermissionHandler() ) {
mServer = new SocketServer( mPortNumber, mMaxQueuedConnections );
this->start();
}
WebServer::~WebServer() {
stop();
join();
delete mServer;
delete mThreadHandler;
delete mPageGenerator;
delete mConnectionPermissionHandler;
}
void WebServer::run() {
char *logMessage = new char[100];
sprintf( logMessage, "Listening for connections on port %d\n",
mPortNumber );
AppLog::info( "WebServer", logMessage );
delete [] logMessage;
char acceptFailed = false;
// main server loop
while( !isStopped() && !acceptFailed ) {
char timedOut = true;
// 5 seconds
long timeout = 5000;
Socket *sock;
AppLog::info( "WebServer", "Waiting for connection." );
while( timedOut && !isStopped() ) {
sock = mServer->acceptConnection( timeout, &timedOut );
}
if( sock != NULL ) {
AppLog::info( "WebServer", "Connection received." );
RequestHandlingThread *thread =
new RequestHandlingThread( sock, mPageGenerator,
mConnectionPermissionHandler );
thread->start();
mThreadHandler->addThread( thread );
}
else if( isStopped() ) {
AppLog::info( "WebServer", "Received stop signal." );
}
else {
AppLog::error( "WebServer", "Accepting a connection failed." );
acceptFailed = true;
}
}
}
|