(file) Return to HTTPAcceptor.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/HTTPAcceptor.cpp between version 1.1.2.3 and 1.2

version 1.1.2.3, 2001/08/01 22:09:09 version 1.2, 2001/12/13 14:53:58
Line 24 
Line 24 
 // Author: Mike Brasher (mbrasher@bmc.com) // Author: Mike Brasher (mbrasher@bmc.com)
 // //
 // Modified By: // Modified By:
   //         Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include <iostream>  
 #include "Config.h" #include "Config.h"
   #include <iostream>
 #include "Socket.h" #include "Socket.h"
  
 #ifdef PEGASUS_OS_TYPE_WINDOWS  #ifdef PEGASUS_PLATFORM_WIN32_IX86_MSVC
 # include <winsock.h> # include <winsock.h>
 #else #else
 # include <cctype> # include <cctype>
Line 46 
Line 47 
 #endif #endif
  
 #include "Socket.h" #include "Socket.h"
   #include "TLS.h"
 #include "HTTPAcceptor.h" #include "HTTPAcceptor.h"
 #include "HTTPConnection.h" #include "HTTPConnection.h"
  
Line 72 
Line 74 
 // //
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
  
 HTTPAcceptor::HTTPAcceptor(Monitor* monitor) : _monitor(monitor), _rep(0)  HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueue* outputMessageQueue)
       : _monitor(monitor), _outputMessageQueue(outputMessageQueue), _rep(0),
         _sslcontext(NULL)
 { {
     // Note: we are counting on the monitor to initialize the socket      Socket::initializeInterface();
     // interface (in Windows you have to call WSAInitialize() and  }
     // WSAShutDown()).  
   HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueue* outputMessageQueue,
                              SSLContext * sslcontext)
       : _monitor(monitor), _outputMessageQueue(outputMessageQueue), _rep(0),
         _sslcontext(sslcontext)
   {
       Socket::initializeInterface();
 } }
  
 HTTPAcceptor::~HTTPAcceptor() HTTPAcceptor::~HTTPAcceptor()
 { {
     unbind();     unbind();
       Socket::uninitializeInterface();
 } }
  
 void HTTPAcceptor::handleEnqueue() void HTTPAcceptor::handleEnqueue()
 { {
     cout << "HTTPAcceptor::handleEnqueue()" << endl;  
   
     Message* message = dequeue();     Message* message = dequeue();
  
     if (!message)     if (!message)
         return;         return;
  
     if (getenv("PEGASUS_TRACE"))  
         message->print(cout);  
   
     switch (message->getType())     switch (message->getType())
     {     {
         case SOCKET_MESSAGE:         case SOCKET_MESSAGE:
Line 145 
Line 151 
     delete message;     delete message;
 } }
  
   const char* HTTPAcceptor::getQueueName() const
   {
       return "HTTPAcceptor";
   }
   
 void HTTPAcceptor::bind(Uint32 portNumber) void HTTPAcceptor::bind(Uint32 portNumber)
 { {
     if (_rep)     if (_rep)
Line 152 
Line 163 
  
     _rep = new HTTPAcceptorRep;     _rep = new HTTPAcceptorRep;
  
       _portNumber = portNumber;
   
       // bind address
       _bind();
   
       return;
   }
   
   /**
    _bind - creates a new server socket and bind socket to the port address.
   */
   void HTTPAcceptor::_bind()
   {
   
     // Create address:     // Create address:
  
     memset(&_rep->address, 0, sizeof(_rep->address));     memset(&_rep->address, 0, sizeof(_rep->address));
     _rep->address.sin_addr.s_addr = INADDR_ANY;     _rep->address.sin_addr.s_addr = INADDR_ANY;
     _rep->address.sin_family = AF_INET;     _rep->address.sin_family = AF_INET;
     _rep->address.sin_port = htons(portNumber);      _rep->address.sin_port = htons(_portNumber);
  
     // Create socket:     // Create socket:
  
Line 170 
Line 195 
         throw BindFailed("Failed to create socket");         throw BindFailed("Failed to create socket");
     }     }
  
       //
       // Set the socket option SO_REUSEADDR to reuse the socket address so
       // that we can rebind to a new socket using the same address when we
       // need to resume the cimom as a result of a timeout during a Shutdown
       // operation.
       //
       int opt=1;
       if (setsockopt(_rep->socket, SOL_SOCKET, SO_REUSEADDR,
                    (char *)&opt, sizeof(opt)) < 0)
       {
           delete _rep;
           _rep = 0;
           throw BindFailed("Failed to set socket option");
       }
   
     // Bind socket to port:     // Bind socket to port:
  
     if (::bind(_rep->socket,     if (::bind(_rep->socket,
Line 208 
Line 248 
     }     }
 } }
  
   /**
    closeConnectionSocket - close the server listening socket to disallow
    new client connections.
   */
   void HTTPAcceptor::closeConnectionSocket()
   {
       if (_rep)
       {
           // unregister the socket
           _monitor->unsolicitSocketMessages(_rep->socket);
   
           // close the socket
           Socket::close(_rep->socket);
       }
   }
   
   /**
    reopenConnectionSocket - creates a new server socket.
   */
   void HTTPAcceptor::reopenConnectionSocket()
   {
       if (_rep)
       {
           _bind();
       }
   }
   
   /**
    getOutstandingRequestCount - returns the number of outstanding requests.
   */
   Uint32 HTTPAcceptor::getOutstandingRequestCount()
   {
       if (_rep->connections.size() > 0)
       {
           HTTPConnection* connection = _rep->connections[0];
           return(connection->getRequestCount());
       }
       else
       {
           return(0);
       }
   }
   
 void HTTPAcceptor::unbind() void HTTPAcceptor::unbind()
 { {
     if (_rep)     if (_rep)
Line 251 
Line 334 
     // Accept the connection (populate the address):     // Accept the connection (populate the address):
  
     sockaddr_in address;     sockaddr_in address;
   
   #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
       size_t n = sizeof(address);
   #else
     int n = sizeof(address);     int n = sizeof(address);
   #endif
   
 #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU)
     Sint32 socket = accept(     Sint32 socket = accept(
         _rep->socket, (struct sockaddr*)&address, (socklen_t *)&n);         _rep->socket, (struct sockaddr*)&address, (socklen_t *)&n);
Line 269 
Line 358 
  
     // Create a new conection and add it to the connection list:     // Create a new conection and add it to the connection list:
  
     HTTPConnection* connection = new HTTPConnection(socket, this);      MP_Socket * mp_socket = new MP_Socket(socket, _sslcontext);
       if (mp_socket->accept() < 0) {
           if (getenv("PEGASUS_TRACE"))
               cerr <<"HTTPAcceptor: SSL_accept() failed" << endl;
   
           return;
       }
   
       HTTPConnection* connection = new HTTPConnection(
           _monitor, mp_socket, this, _outputMessageQueue);
  
     // Solicit events on this new connection socket:      // Solicit events on this new connection's socket:
  
     if (!_monitor->solicitSocketMessages(     if (!_monitor->solicitSocketMessages(
         socket,         socket,


Legend:
Removed from v.1.1.2.3  
changed lines
  Added in v.1.2

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2