(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.11 and 1.19

version 1.1.2.11, 2001/12/10 16:42:42 version 1.19, 2002/05/30 00:12:38
Line 25 
Line 25 
 // //
 // Modified By: // Modified By:
 //         Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com) //         Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)
   //         Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include "Config.h" #include "Config.h"
   #include "Constants.h"
 #include <iostream> #include <iostream>
 #include "Socket.h" #include "Socket.h"
  
 #ifdef PEGASUS_PLATFORM_WIN32_IX86_MSVC #ifdef PEGASUS_PLATFORM_WIN32_IX86_MSVC
 # include <winsock.h>  #include <windows.h>
 #else #else
 # include <cctype> # include <cctype>
 # include <unistd.h> # include <unistd.h>
Line 44 
Line 46 
 # include <netinet/in.h> # include <netinet/in.h>
 # include <arpa/inet.h> # include <arpa/inet.h>
 # include <sys/socket.h> # include <sys/socket.h>
   # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
   #  include <sys/un.h>
   # endif
 #endif #endif
  
 #include "Socket.h" #include "Socket.h"
 #include "TLS.h" #include "TLS.h"
 #include "HTTPAcceptor.h" #include "HTTPAcceptor.h"
 #include "HTTPConnection.h" #include "HTTPConnection.h"
   #include "Tracer.h"
  
 PEGASUS_USING_STD; PEGASUS_USING_STD;
  
Line 63 
Line 69 
  
 struct HTTPAcceptorRep struct HTTPAcceptorRep
 { {
   #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
         struct sockaddr_un address;
   #else
     struct sockaddr_in address;     struct sockaddr_in address;
   #endif
     Sint32 socket;     Sint32 socket;
     Array<HTTPConnection*> connections;     Array<HTTPConnection*> connections;
 }; };
Line 75 
Line 85 
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
  
 HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueue* outputMessageQueue) HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueue* outputMessageQueue)
     : _monitor(monitor), _outputMessageQueue(outputMessageQueue), _rep(0),     : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),
       _sslcontext(NULL)       _monitor(monitor), _outputMessageQueue(outputMessageQueue),
        _rep(0), _sslcontext(NULL)
 { {
   
     Socket::initializeInterface();     Socket::initializeInterface();
 } }
  
 HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueue* outputMessageQueue, HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueue* outputMessageQueue,
                            SSLContext * sslcontext)                            SSLContext * sslcontext)
     : _monitor(monitor), _outputMessageQueue(outputMessageQueue), _rep(0),     :       Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),
              _monitor(monitor), _outputMessageQueue(outputMessageQueue),
              _rep(0),
       _sslcontext(sslcontext)       _sslcontext(sslcontext)
 { {
     Socket::initializeInterface();     Socket::initializeInterface();
Line 95 
Line 109 
     Socket::uninitializeInterface();     Socket::uninitializeInterface();
 } }
  
 void HTTPAcceptor::handleEnqueue()  void HTTPAcceptor::handleEnqueue(Message *message)
 { {
     Message* message = dequeue();  
   
     if (!message)     if (!message)
         return;         return;
  
Line 137 
Line 149 
                 {                 {
                     _monitor->unsolicitSocketMessages(socket);                     _monitor->unsolicitSocketMessages(socket);
                     _rep->connections.remove(i);                     _rep->connections.remove(i);
                  while (connection->refcount.value()) { }
                     delete connection;                     delete connection;
                     break;                     break;
                 }                 }
Line 151 
Line 164 
     delete message;     delete message;
 } }
  
 const char* HTTPAcceptor::getQueueName() const  
   void HTTPAcceptor::handleEnqueue()
 { {
     return "HTTPAcceptor";     Message* message = dequeue();
   
      if (!message)
         return;
   
      handleEnqueue(message);
   
 } }
  
 void HTTPAcceptor::bind(Uint32 portNumber) void HTTPAcceptor::bind(Uint32 portNumber)
Line 173 
Line 193 
  
 /** /**
  _bind - creates a new server socket and bind socket to the port address.  _bind - creates a new server socket and bind socket to the port address.
      If PEGASUS_LOCAL_DOMAIN_SOCKET is defined, the port number is ignored and
      a domain socket is bound.
 */ */
 void HTTPAcceptor::_bind() void HTTPAcceptor::_bind()
 { {
Line 180 
Line 202 
     // Create address:     // Create address:
  
     memset(&_rep->address, 0, sizeof(_rep->address));     memset(&_rep->address, 0, sizeof(_rep->address));
   
   #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
      _rep->address.sun_family = AF_UNIX;
      strcpy(_rep->address.sun_path, "/var/opt/wbem/cimxml.socket");
      ::unlink(_rep->address.sun_path);
   #else
     _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);
   #endif
  
     // Create socket:     // Create socket:
  
   #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
      _rep->socket = socket(AF_UNIX, SOCK_STREAM, 0);
   #else
     _rep->socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);     _rep->socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
   #endif
  
     if (_rep->socket < 0)     if (_rep->socket < 0)
     {     {
Line 213 
Line 246 
     // Bind socket to port:     // Bind socket to port:
  
     if (::bind(_rep->socket,     if (::bind(_rep->socket,
         (struct sockaddr*)(void*)&_rep->address,                reinterpret_cast<struct sockaddr*>(&_rep->address),
         sizeof(_rep->address)) < 0)         sizeof(_rep->address)) < 0)
     {     {
         Socket::close(_rep->socket);         Socket::close(_rep->socket);
         delete _rep;         delete _rep;
         _rep = 0;         _rep = 0;
         throw BindFailed("Failed to bind socket to port");        throw BindFailed("Failed to bind socket");
     }     }
  
     // Set up listening on the given port:     // Set up listening on the given socket:
  
     int const MAX_CONNECTION_QUEUE_LENGTH = 5;     int const MAX_CONNECTION_QUEUE_LENGTH = 5;
  
Line 231 
Line 264 
         Socket::close(_rep->socket);         Socket::close(_rep->socket);
         delete _rep;         delete _rep;
         _rep = 0;         _rep = 0;
         throw BindFailed("Failed to bind socket to port");        throw BindFailed("Failed to bind socket");
     }     }
  
     // Register to receive SocketMessages on this socket:     // Register to receive SocketMessages on this socket:
Line 239 
Line 272 
     if (!_monitor->solicitSocketMessages(     if (!_monitor->solicitSocketMessages(
         _rep->socket,         _rep->socket,
         SocketMessage::READ | SocketMessage::EXCEPTION,         SocketMessage::READ | SocketMessage::EXCEPTION,
         getQueueId()))            getQueueId(),
             Monitor::ACCEPTOR))
     {     {
         Socket::close(_rep->socket);         Socket::close(_rep->socket);
         delete _rep;         delete _rep;
Line 275 
Line 309 
     }     }
 } }
  
   /**
      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 300 
Line 350 
  
         // Destroy the connection (causing it to close):         // Destroy the connection (causing it to close):
  
         while (connection->refcount.value()) { }
         delete connection;         delete connection;
     }     }
  
Line 319 
Line 370 
  
     sockaddr_in address;     sockaddr_in address;
  
 #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX)
     size_t n = sizeof(address);     size_t n = sizeof(address);
 #else #else
     int n = sizeof(address);     int n = sizeof(address);
 #endif #endif
  
 #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU)  #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU)
     Sint32 socket = accept(     Sint32 socket = accept(
         _rep->socket, (struct sockaddr*)&address, (socklen_t *)&n);         _rep->socket, (struct sockaddr*)&address, (socklen_t *)&n);
 #else #else
     Sint32 socket = accept(_rep->socket, (struct sockaddr*)&address, &n);     Sint32 socket = accept(_rep->socket, reinterpret_cast<struct sockaddr*>(&address), &n);
 #endif #endif
  
     if (socket < 0)     if (socket < 0)
     {     {
         if (getenv("PEGASUS_TRACE"))         PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
             cerr <<"HTTPAcceptor: accept() failed" << endl;                          "HTTPAcceptor: accept() failed");
   
         return;         return;
     }     }
  
     // Create a new conection and add it to the connection list:     // Create a new conection and add it to the connection list:
  
     MP_Socket * mp_socket = new MP_Socket(socket, _sslcontext);     MP_Socket * mp_socket = new MP_Socket(socket, _sslcontext);
     if (mp_socket->accept() < 0) {     if (mp_socket->accept() < 0)
         if (getenv("PEGASUS_TRACE"))     {
             cerr <<"HTTPAcceptor: SSL_accept() failed" << endl;         PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
                           "HTTPAcceptor: SSL_accept() failed");
         return;         return;
     }     }
  
     HTTPConnection* connection = new HTTPConnection(     HTTPConnection* connection = new HTTPConnection(
         _monitor, mp_socket, this, _outputMessageQueue);        _monitor, mp_socket, this, static_cast<MessageQueue *>(_outputMessageQueue));
  
     // Solicit events on this new connection's socket:     // Solicit events on this new connection's socket:
  
     if (!_monitor->solicitSocketMessages(     if (!_monitor->solicitSocketMessages(
         socket,         socket,
         SocketMessage::READ | SocketMessage::EXCEPTION,         SocketMessage::READ | SocketMessage::EXCEPTION,
         connection->getQueueId()))            connection->getQueueId(), Monitor::CONNECTION))
     {     {
         delete connection;         delete connection;
         Socket::close(socket);         Socket::close(socket);


Legend:
Removed from v.1.1.2.11  
changed lines
  Added in v.1.19

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2