File: WebServer.cpp

package info (click to toggle)
between 6%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 3,532 kB
  • sloc: cpp: 28,110; php: 718; ansic: 638; objc: 245; sh: 236; makefile: 97; perl: 67
file content (115 lines) | stat: -rw-r--r-- 2,545 bytes parent folder | download | duplicates (18)
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;
            }
        }
    
    }