(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.81.8.12 and 1.89

version 1.81.8.12, 2006/10/18 04:24:42 version 1.89, 2006/10/13 18:17:52
Line 29 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By:  
 //          Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)  
 //          Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)  
 //          Dave Rosckes (rosckes@us.ibm.com)  
 //          Denise Eckstein (denise.eckstein@hp.com)  
 //          Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090  
 //          Amit Arora, IBM (amita@in.ibm.com) for Bug#2541  
 //          Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)  
 //          Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)  
 //          Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) for Bug#2065  
 //          David Dillard, Symantec Corp. (david_dillard@symantec.com)  
 //          John Alex, IBM (johnalex@us.ibm.com) for Bug#3312  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include "Config.h" #include "Config.h"
 #include "Constants.h" #include "Constants.h"
 #include <iostream> #include <iostream>
 #include "Socket.h"  
   
 #ifdef PEGASUS_OS_TYPE_WINDOWS  
 # include <windows.h>  
 #else  
 # include <cctype>  
 # include <cstdlib>  
 # include <errno.h>  
 # include <fcntl.h>  
 # include <netdb.h>  
 # include <netinet/in.h>  
 # include <netinet/tcp.h>  
 # include <arpa/inet.h>  
 # include <sys/socket.h>  
   
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET  
 # include <unistd.h>  
 # include <sys/un.h>  
 # endif  
 #endif  
  
   #include "Network.h"
 #include "Socket.h" #include "Socket.h"
 #include "TLS.h" #include "TLS.h"
 #include "HTTPAcceptor.h" #include "HTTPAcceptor.h"
Line 78 
Line 44 
 #include <Pegasus/Common/MessageLoader.h> //l10n #include <Pegasus/Common/MessageLoader.h> //l10n
  
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
 # include "OS400ConvertChar.h"  #include "EBCDIC_OS400.h"
 #endif #endif
  
  
Line 102 
Line 68 
     {     {
         if (local)         if (local)
         {         {
   
 #ifndef PEGASUS_OS_TYPE_WINDOWS  
 # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
   
             address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);             address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);
             address_size = sizeof(struct sockaddr_un);             address_size = sizeof(struct sockaddr_un);
 # else # else
             PEGASUS_ASSERT(false);             PEGASUS_ASSERT(false);
 # endif # endif
   
 #endif  
         }         }
         else         else
         {         {
Line 126 
Line 87 
     }     }
     struct sockaddr* address;     struct sockaddr* address;
  
     PEGASUS_SOCKLEN_T address_size;      SocketLength address_size;
     Mutex _connection_mut;     Mutex _connection_mut;
  
     PEGASUS_SOCKET socket;      SocketHandle socket;
   
 // Added for NamedPipe implementation for windows  
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
     NamedPipeServer* namedPipeServer;  
 #endif  
     Array<HTTPConnection*> connections;     Array<HTTPConnection*> connections;
 }; };
  
 //------------------------------------------------------------------------------  
 //  
 // _setTCPNoDelay()  
 //  
 //------------------------------------------------------------------------------  
   
 inline void _setTCPNoDelay(PEGASUS_SOCKET socket)  
 {  
     // This function disables "Nagle's Algorithm" also known as "the TCP delay  
     // algorithm", which causes read operations to obtain whatever data is  
     // already in the input queue and then wait a little longer to see if  
     // more data arrives. This algorithm optimizes the case in which data is  
     // sent in only one direction but severely impairs performance of round  
     // trip servers. Disabling TCP delay is a standard technique for round  
     // trip servers.  
   
    int opt = 1;  
    setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char*)&opt, sizeof(opt));  
 }  
  
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
 // //
Line 169 
Line 106 
                            Boolean localConnection,                            Boolean localConnection,
                            Uint32 portNumber,                            Uint32 portNumber,
                            SSLContext * sslcontext,                            SSLContext * sslcontext,
                            Boolean exportConnection,  
                            ReadWriteSem* sslContextObjectLock)                            ReadWriteSem* sslContextObjectLock)
    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?
      _monitor(monitor),      _monitor(monitor),
Line 179 
Line 115 
      _localConnection(localConnection),      _localConnection(localConnection),
      _portNumber(portNumber),      _portNumber(portNumber),
      _sslcontext(sslcontext),      _sslcontext(sslcontext),
      _exportConnection(exportConnection),  
      _sslContextObjectLock(sslContextObjectLock)      _sslContextObjectLock(sslContextObjectLock)
 { {
    Socket::initializeInterface();    Socket::initializeInterface();
Line 257 
Line 192 
          break;          break;
       }       }
  
 // Added for NamedPipe implementation for windows  
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
       case NAMEDPIPE_MESSAGE:  
       {  
          NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message;  
   
          if (((namedPipeMessage->namedPipe.getPipe()) == ( _rep->namedPipeServer->getPipe())) &&  
              (namedPipeMessage->events & NamedPipeMessage::READ))  
          {  
              _acceptNamedPipeConnection();  
          }  
          else  
          {  
             // ATTN! this can't happen!  
             Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,  
               "HTTPAcceptor::handleEnqueue: Invalid NAMEDPIPE_MESSAGE received.");  
          }  
          break;  
       }  
 #endif  
      // may Need to close connection for Named Pipe too.....??  
      case CLOSE_CONNECTION_MESSAGE:      case CLOSE_CONNECTION_MESSAGE:
      {      {
         CloseConnectionMessage* closeConnectionMessage         CloseConnectionMessage* closeConnectionMessage
Line 288 
Line 202 
         for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)         for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
         {         {
             HTTPConnection* connection = _rep->connections[i];             HTTPConnection* connection = _rep->connections[i];
 // Added for NamedPipe implementation for windows          SocketHandle socket = connection->getSocket();
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
             if(!connection->isNamedPipeConnection())  
             {  
 #endif  
                 PEGASUS_SOCKET socket = connection->getSocket();  
  
                 if (socket == closeConnectionMessage->socket)                 if (socket == closeConnectionMessage->socket)
                 {                 {
Line 302 
Line 211 
                     delete connection;                     delete connection;
                     break;                     break;
                 }                 }
 // Added for NamedPipe implementation for windows  
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
             }  
             else  
             {  
                 NamedPipe namedPipe = connection->getNamedPipe();  
                 //NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message;  
   
                 if (namedPipe.getPipe() == closeConnectionMessage->namedPipe.getPipe())  
                 {  
                     _monitor->unsolicitPipeMessages(namedPipe);  
                     _rep->connections.remove(i);  
                     delete connection;  
                     break;  
                 }  
             }  
 #endif  
         }         }
  
         break;         break;
Line 379 
Line 271 
 */ */
 void HTTPAcceptor::_bind() void HTTPAcceptor::_bind()
 { {
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         PEGASUS_STD(cout) << "in HTTPAcceptor::_bind at the begining" << PEGASUS_STD(endl);  
         PEGASUS_STD(cout) << "in HTTPAcceptor::_bind before ASSERT" << PEGASUS_STD(endl);  
     }  
 #endif  
    PEGASUS_ASSERT(_rep != 0);    PEGASUS_ASSERT(_rep != 0);
    // Create address:    // Create address:
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
    {  
        AutoMutex automut(Monitor::_cout_mut);  
        PEGASUS_STD(cout) << "in HTTPAcceptor::_bind before memset" << PEGASUS_STD(endl);  
    }  
 #endif  
  
   
 #if defined PEGASUS_OS_TYPE_WINDOWS  
    if (!_localConnection)  
    {  
 #endif  
        memset(_rep->address, 0, sizeof(*_rep->address));        memset(_rep->address, 0, sizeof(*_rep->address));
 #if defined PEGASUS_OS_TYPE_WINDOWS  
    }  
 #endif  
   
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
    {  
        AutoMutex automut(Monitor::_cout_mut);  
        PEGASUS_STD(cout) << "in HTTPAcceptor::_bind After memset" << PEGASUS_STD(endl);  
    }  
 #endif  
  
    if (_localConnection)    if (_localConnection)
    {    {
 // Added for NamedPipe implementation for windows  
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
   
 # ifdef PEGASUS_OS_TYPE_WINDOWS  
 #  ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
        {  
            AutoMutex automut(Monitor::_cout_mut);  
            PEGASUS_STD(cout) << "in HTTPAcceptor::_bind before calling _createNamedPipe() "  
                              << PEGASUS_STD(endl);  
        }  
 #  endif  
        _createNamedPipe();  
 # ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
        {  
            AutoMutex automut(Monitor::_cout_mut);  
            PEGASUS_STD(cout) << "in HTTPAcceptor::_bind after calling _createNamedPipe() " << PEGASUS_STD(endl);  
        }  
 # endif  
        return;  
 # else // Other than Windows platform  
        reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family =        reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family =
            AF_UNIX;            AF_UNIX;
        strcpy(         strcpy(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path,
            reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path,  
            PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);            PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);
   
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
        AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);        AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 #endif #endif
        ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);        ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 # endif  
   
 #else #else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 #endif #endif
Line 461 
Line 303 
    }    }
  
    // Create socket:    // Create socket:
   
    if (_localConnection)    if (_localConnection)
    {    {
        _rep->socket = socket(AF_UNIX, SOCK_STREAM, 0);         _rep->socket = Socket::createSocket(AF_UNIX, SOCK_STREAM, 0);
    }    }
    else    else
    {    {
        _rep->socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);         _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  
        _setTCPNoDelay(_rep->socket);  
    }    }
  
    if (_rep->socket < 0)    if (_rep->socket < 0)
Line 506 
Line 348 
    }    }
 #endif #endif
  
   
    //    //
    // Set the socket option SO_REUSEADDR to reuse the socket address so    // 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    // that we can rebind to a new socket using the same address when we
Line 528 
Line 371 
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
  
   
    //    //
    // Bind socket to port:    // Bind socket to port:
    //    //
Line 545 
Line 389 
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
  
   
    //    //
    // Get the actual port value used if the caller specified a port value of 0.    // Get the actual port value used if the caller specified a port value of 0.
    //    //
    if ( _portNumber == 0 )    if ( _portNumber == 0 )
    {    {
       sockaddr_in buf;       sockaddr_in buf;
       PEGASUS_SOCKLEN_T bufSize = sizeof(buf);        SocketLength bufSize = sizeof(buf);
       if ( getsockname(_rep->socket, reinterpret_cast<sockaddr *>(&buf), &bufSize) == 0 )       if ( getsockname(_rep->socket, reinterpret_cast<sockaddr *>(&buf), &bufSize) == 0 )
       {       {
           _portNumber = ntohs(buf.sin_port);           _portNumber = ntohs(buf.sin_port);
       }       }
    }    }
  
   
    //    //
    //  Change permissions on Linux local domain socket to allow writes by others.    //  Change permissions on Linux local domain socket to allow writes by others.
    //    //
Line 584 
Line 430 
 #endif #endif
  
    // Set up listening on the given socket:    // Set up listening on the given socket:
   
    //int const MAX_CONNECTION_QUEUE_LENGTH = 15;    //int const MAX_CONNECTION_QUEUE_LENGTH = 15;
  
    if (listen(_rep->socket, MAX_CONNECTION_QUEUE_LENGTH) < 0)    if (listen(_rep->socket, MAX_CONNECTION_QUEUE_LENGTH) < 0)
Line 619 
Line 466 
                   "HTTPAcceptor::_bind: Failed to solicit socket messages(2).");                   "HTTPAcceptor::_bind: Failed to solicit socket messages(2).");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
    {  
        AutoMutex automut(Monitor::_cout_mut);  
        PEGASUS_STD(cout) << "in HTTPAcceptor::_bind at the End" << PEGASUS_STD(endl);  
    }  
 #endif  
   
 } }
  
 /** /**
Line 646 
Line 486 
       // Unlink Local Domain Socket Bug# 3312       // Unlink Local Domain Socket Bug# 3312
       if (_localConnection)       if (_localConnection)
       {       {
 #ifndef PEGASUS_OS_TYPE_WINDOWS  
 # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,           PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
                         "HTTPAcceptor::closeConnectionSocket Unlinking local connection." );                         "HTTPAcceptor::closeConnectionSocket Unlinking local connection." );
Line 655 
Line 494 
 # else # else
          PEGASUS_ASSERT(false);          PEGASUS_ASSERT(false);
 # endif # endif
 #endif  
       }       }
  
    }    }
Line 682 
Line 520 
    }    }
 } }
  
   
   /**
      reconnectConnectionSocket - creates a new server socket.
   */
   void HTTPAcceptor::reconnectConnectionSocket()
   {
      if (_rep)
      {
         // unregister the socket
         _monitor->unsolicitSocketMessages(_rep->socket);
         // close the socket
         Socket::close(_rep->socket);
         // Unlink Local Domain Socket Bug# 3312
         if (_localConnection)
         {
   #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
             PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
                           "HTTPAcceptor::reconnectConnectionSocket Unlinking local connection." );
            ::unlink(
                reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
   #else
            PEGASUS_ASSERT(false);
   #endif
         }
         // open the socket
         _bind();
      }
      else
      {
         PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                           "HTTPAcceptor::reconnectConnectionSocket failure _rep is null." );
      }
   }
   
 /** /**
    getOutstandingRequestCount - returns the number of outstanding requests.    getOutstandingRequestCount - returns the number of outstanding requests.
 */ */
Line 709 
Line 581 
     return _portNumber;     return _portNumber;
 } }
  
   void HTTPAcceptor::setSocketWriteTimeout(Uint32 socketWriteTimeout)
   {
       _socketWriteTimeout = socketWriteTimeout;
   }
   
 void HTTPAcceptor::unbind() void HTTPAcceptor::unbind()
 { {
    if (_rep)    if (_rep)
Line 719 
Line 596 
       if (_localConnection)       if (_localConnection)
       {       {
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
 # ifndef PEGASUS_OS_TYPE_WINDOWS  
   
          ::unlink(          ::unlink(
              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 # endif  
 #else #else
          PEGASUS_ASSERT(false);          PEGASUS_ASSERT(false);
 #endif #endif
Line 749 
Line 623 
      for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)      for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
      {      {
         HTTPConnection* connection = _rep->connections[i];         HTTPConnection* connection = _rep->connections[i];
 // Added for NamedPipe implementation for windows          SocketHandle socket = connection->getSocket();
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
         if(!connection->isNamedPipeConnection())  
         {  
 #endif  
             PEGASUS_SOCKET socket = connection->getSocket();  
  
            // Unsolicit SocketMessages:            // Unsolicit SocketMessages:
  
            _monitor->unsolicitSocketMessages(socket);            _monitor->unsolicitSocketMessages(socket);
  
 // Added for NamedPipe implementation for windows  
 // Destroy the connection (causing it to close): // Destroy the connection (causing it to close):
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
         }  
         else  
         {  
             NamedPipe namedPipe = connection->getNamedPipe();  
             _monitor->unsolicitPipeMessages(namedPipe);  
         }  
 #endif  
         while (connection->refcount.get()) { }         while (connection->refcount.get()) { }
         delete connection;         delete connection;
      }      }
Line 784 
Line 645 
  
    PEGASUS_ASSERT(_rep != 0);    PEGASUS_ASSERT(_rep != 0);
  
    if (!_rep)  
       return;  
   
    // Accept the connection (populate the address):    // Accept the connection (populate the address):
   
    struct sockaddr* accept_address;    struct sockaddr* accept_address;
    PEGASUS_SOCKLEN_T address_size;     SocketLength address_size;
  
    if (_localConnection)    if (_localConnection)
    {    {
 #ifndef PEGASUS_OS_TYPE_WINDOWS  
 # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
        accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);        accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);
        address_size = sizeof(struct sockaddr_un);        address_size = sizeof(struct sockaddr_un);
 # else # else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 # endif # endif
 #endif  
    }    }
    else    else
    {    {
Line 808 
Line 665 
        address_size = sizeof(struct sockaddr_in);        address_size = sizeof(struct sockaddr_in);
    }    }
  
    PEGASUS_SOCKET socket = accept(_rep->socket, accept_address, &address_size);     SocketHandle socket = accept(_rep->socket, accept_address, &address_size);
  
      if (socket == PEGASUS_SOCKET_ERROR)
      {
          // the remote connection is invalid, destroy client address.
    delete accept_address;    delete accept_address;
  
    if (socket < 0)         // TCPIP is down reconnect this acceptor
          if(getSocketError() == PEGASUS_NETWORK_TCPIP_STOPPED)
    {    {
  
              PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                       "Socket has an IO error. TCP/IP down. Try to reconnect." );
   
              reconnectConnectionSocket();
   
              return;
          }
        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
            "HTTPAcceptor - accept() failure.  errno: $0"            "HTTPAcceptor - accept() failure.  errno: $0"
            ,errno);            ,errno);
Line 824 
Line 692 
       return;       return;
    }    }
  
      String ipAddress;
   
      if (_localConnection)
      {
          ipAddress = "localhost";
      }
      else
      {
          unsigned char* sa = reinterpret_cast<unsigned char*>(
              &reinterpret_cast<struct sockaddr_in*>(
                  accept_address)->sin_addr.s_addr);
          char ipBuffer[32];
          sprintf(ipBuffer, "%u.%u.%u.%u", sa[0], sa[1], sa[2], sa[3]);
          ipAddress = ipBuffer;
      }
   
      delete accept_address;
   
 // set the close on exec flag // set the close on exec flag
 #if !defined(PEGASUS_OS_TYPE_WINDOWS) && !defined(PEGASUS_OS_VMS) #if !defined(PEGASUS_OS_TYPE_WINDOWS) && !defined(PEGASUS_OS_VMS)
    int sock_flags;    int sock_flags;
Line 848 
Line 734 
        "HTTPAcceptor - accept() success.  Socket: $1" ,socket));        "HTTPAcceptor - accept() success.  Socket: $1" ,socket));
  
    AutoPtr<MP_Socket> mp_socket(new MP_Socket(    AutoPtr<MP_Socket> mp_socket(new MP_Socket(
        socket, _sslcontext, _sslContextObjectLock, _exportConnection));         socket, _sslcontext, _sslContextObjectLock));
   
      mp_socket->setSocketWriteTimeout(_socketWriteTimeout);
  
    // Perform the SSL handshake, if applicable.  Make the socket non-blocking    // Perform the SSL handshake, if applicable.  Make the socket non-blocking
    // for this operation so we can send it back to the Monitor's select() loop    // for this operation so we can send it back to the Monitor's select() loop
Line 869 
Line 757 
    // Create a new connection and add it to the connection list:    // Create a new connection and add it to the connection list:
  
    HTTPConnection* connection = new HTTPConnection(_monitor, mp_socket,    HTTPConnection* connection = new HTTPConnection(_monitor, mp_socket,
        this, static_cast<MessageQueue *>(_outputMessageQueue), _exportConnection);         ipAddress, this, static_cast<MessageQueue *>(_outputMessageQueue));
  
    if (socketAcceptStatus == 0)    if (socketAcceptStatus == 0)
    {    {
Line 901 
Line 789 
    _rep->connections.append(connection);    _rep->connections.append(connection);
 } }
  
 // Added for NamedPipe implementation for windows  
 #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)  
 void HTTPAcceptor::_createNamedPipe()  
 {  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         PEGASUS_STD(cout) << "Entering  HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl);  
     }  
 #endif  
     _rep->namedPipeServer = new NamedPipeServer(PEGASUS_NAMEDPIPE_PATH);  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() after calling the pipe server constructor" << PEGASUS_STD(endl);  
     }  
   
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         cout << "Named pipe...in _createNamedPipe..." << _rep->namedPipeServer->getPipe() << endl;  
     }  
 #endif  
     // Register to receive Messages on Connection pipe:  
   
    if ( -1 == ( _entry_index = _monitor->solicitPipeMessages(  
       *_rep->namedPipeServer,  
       NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION,  
       getQueueId(),  
       Monitor::ACCEPTOR)))  
    {  
        ::CloseHandle(_rep->namedPipeServer->getPipe());  
        delete _rep;  
        _rep = 0;  
        //l10n  
        MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES",  
                     "Failed to solicit socket messaeges");  
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,  
                    "HTTPAcceptor::_bind: Failed to solicit pipe messages(2).");  
        throw BindFailedException(parms);  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
        {  
            AutoMutex automut(Monitor::_cout_mut); //added  
            PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() _monitor->solicitSocketMessages failed"  
                              << PEGASUS_STD(endl);  
        }  
 #endif  
    }  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
    {  
        AutoMutex automut(Monitor::_cout_mut);  
        PEGASUS_STD(cout) << "Leaving  HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl);  
    }  
 #endif  
    return;  
 }  
   
 void HTTPAcceptor::_acceptNamedPipeConnection()  
 {  
     PEGASUS_ASSERT(_rep != 0);  
   
     if (!_rep)  
        return;  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         cout <<"In HTTPAcceptor::_acceptNamedPipeConnection " << endl;  
     }  
 #endif  
   
   
     NamedPipeServerEndPiont nPSEndPoint = _rep->namedPipeServer->accept();  
     // Register to receive Messages on Connection pipe:  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         cout << " In _acceptNamedPipeConnection -- after calling namedPipeServer->accept()" << endl;  
     }  
 #endif  
     HTTPConnection* connection = new HTTPConnection(_monitor, nPSEndPoint,  
         this, static_cast<MessageQueue *>(_outputMessageQueue), _exportConnection);  
   
     // Solicit events on this new connection's socket:  
     int index;  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
     {  
         AutoMutex automut(Monitor::_cout_mut);  
         cout << endl << connection->getNamedPipe().getName() << " has a this as a QueueID " <<  
          connection->getQueueId() << endl;  
     }  
 #endif  
     if (-1 ==  (index = _monitor->solicitPipeMessages(  
        connection->getNamedPipe(),  
        NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION,  
        connection->getQueueId(), Monitor::ACCEPTOR)) )  
     {  
        // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return  
        // an error message to Client application.  
        Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,  
            "HTTPAcceptor::_acceptPipeConnection: Attempt to allocate entry in _entries table failed.");  
        delete connection;  
        return;  
     }  
   
     // Save the socket for cleanup later:  
     connection->_entry_index = index;  
     AutoMutex autoMut(_rep->_connection_mut);  
     _rep->connections.append(connection);  
 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG  
   {  
       AutoMutex automut(Monitor::_cout_mut);  
       PEGASUS_STD(cout)  
        << "in HTTPAcceptor::_acceptNamedPipeConnection() at the end" << PEGASUS_STD(endl);  
   }  
 #endif  
 }  
 #endif  
   
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.81.8.12  
changed lines
  Added in v.1.89

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2