(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.124 and 1.133

version 1.124, 2008/06/19 17:57:00 version 1.133, 2012/07/16 11:27:16
Line 1 
Line 1 
 //%2006////////////////////////////////////////////////////////////////////////  //%LICENSE////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development  // Licensed to The Open Group (TOG) under one or more contributor license
 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.  // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;  // this work for additional information regarding copyright ownership.
 // IBM Corp.; EMC Corporation, The Open Group.  // Each contributor licenses this file to you under the OpenPegasus Open
 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;  // Source License; you may not use this file except in compliance with the
 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.  // License.
 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;  //
 // EMC Corporation; VERITAS Software Corporation; The Open Group.  // Permission is hereby granted, free of charge, to any person obtaining a
 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;  // copy of this software and associated documentation files (the "Software"),
 // EMC Corporation; Symantec Corporation; The Open Group.  // to deal in the Software without restriction, including without limitation
 //  // the rights to use, copy, modify, merge, publish, distribute, sublicense,
 // Permission is hereby granted, free of charge, to any person obtaining a copy  // and/or sell copies of the Software, and to permit persons to whom the
 // of this software and associated documentation files (the "Software"), to  // Software is furnished to do so, subject to the following conditions:
 // deal in the Software without restriction, including without limitation the  //
 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or  // The above copyright notice and this permission notice shall be included
 // sell copies of the Software, and to permit persons to whom the Software is  // in all copies or substantial portions of the Software.
 // furnished to do so, subject to the following conditions:  //
 //  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN  // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED  // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT  // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR  // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT  // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN  // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
 // //
 //==============================================================================  //////////////////////////////////////////////////////////////////////////
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
Line 56 
Line 54 
  
 static int _maxConnectionQueueLength = -1; static int _maxConnectionQueueLength = -1;
  
   Uint32 HTTPAcceptor::_socketWriteTimeout =
       PEGASUS_DEFAULT_SOCKETWRITE_TIMEOUT_SECONDS;
   
   #ifndef PEGASUS_INTEGERS_BOUNDARY_ALIGNED
   Mutex HTTPAcceptor::_socketWriteTimeoutMutex;
   #endif
   
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
 // //
 // HTTPAcceptorRep // HTTPAcceptorRep
Line 129 
Line 134 
                            Uint16 connectionType,                            Uint16 connectionType,
                            Uint32 portNumber,                            Uint32 portNumber,
                            SSLContext * sslcontext,                            SSLContext * sslcontext,
                            ReadWriteSem* sslContextObjectLock)                             ReadWriteSem* sslContextObjectLock,
                              HostAddress *listenOn)
    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?
      _monitor(monitor),      _monitor(monitor),
      _outputMessageQueue(outputMessageQueue),      _outputMessageQueue(outputMessageQueue),
Line 139 
Line 145 
      _portNumber(portNumber),      _portNumber(portNumber),
      _sslcontext(sslcontext),      _sslcontext(sslcontext),
      _sslContextObjectLock(sslContextObjectLock),      _sslContextObjectLock(sslContextObjectLock),
      _idleConnectionTimeoutSeconds(0)      _listenAddress(listenOn)
 { {
    PEGASUS_ASSERT(!_sslcontext == !_sslContextObjectLock);    PEGASUS_ASSERT(!_sslcontext == !_sslContextObjectLock);
    Socket::initializeInterface();    Socket::initializeInterface();
Line 275 
Line 281 
     _bind();     _bind();
 } }
  
   
 /** /**
     _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_DISABLE_LOCAL_DOMAIN_SOCKET is not defined, the port number is     If PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET is not defined, the port number is
Line 283 
Line 290 
 void HTTPAcceptor::_bind() void HTTPAcceptor::_bind()
 { {
 #ifdef PEGASUS_OS_PASE #ifdef PEGASUS_OS_PASE
     // bind need ccsid is 819      AutoPtr<PaseCcsid> ccsid;
     int orig_ccsid;  
     orig_ccsid = _SETCCSID(-1);  
     if (orig_ccsid == -1)  
     {  
         PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,  
             String("HTTPAcceptor::_bind: Can not get current PASE CCSID."));  
         orig_ccsid = 1208;  
     }  
     PaseCcsid ccsid(819, orig_ccsid);  
 #endif #endif
  
     PEGASUS_ASSERT(_rep != 0);     PEGASUS_ASSERT(_rep != 0);
Line 307 
Line 305 
         // user.  Otherwise, the bind may fail with a vague "bind failed"         // user.  Otherwise, the bind may fail with a vague "bind failed"
         // error.         // error.
         //         //
   #ifdef PEGASUS_OS_PASE
           // PASE domain socket needs ccsid 819
           int orig_ccsid;
           orig_ccsid = _SETCCSID(-1);
           if (orig_ccsid == -1)
           {
               PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
                       "HTTPAcceptor::_bind: Can not get current PASE CCSID.");
               orig_ccsid = 1208;
           }
           ccsid.reset(new PaseCcsid(819, orig_ccsid));
   #endif
         if (System::exists(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH))         if (System::exists(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH))
         {         {
             if (!System::removeFile(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH))             if (!System::removeFile(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH))
Line 326 
Line 336 
 #ifdef PEGASUS_ENABLE_IPV6 #ifdef PEGASUS_ENABLE_IPV6
     else if (_connectionType == IPV6_CONNECTION)     else if (_connectionType == IPV6_CONNECTION)
     {     {
           if(_listenAddress)
           {
               String hostAdd = _listenAddress->getHost();
               CString ip = hostAdd.getCString();
   
               struct sockaddr_in6 in6addr;
               memset(&in6addr, 0, sizeof(sockaddr_in6));
               if(_listenAddress ->isHostAddLinkLocal())
               {
                   HostAddress::convertTextToBinary(AF_INET6,
                   (const char*)ip,
                   &in6addr.sin6_addr);
                   reinterpret_cast<struct sockaddr_in6*>(
                       _rep->address)->sin6_addr = in6addr.sin6_addr;
                   reinterpret_cast<struct sockaddr_in6*>(
                       _rep->address)->sin6_scope_id =
                           _listenAddress->getScopeID();
               }
               else
               {
                   HostAddress::convertTextToBinary(AF_INET6,
                   (const char*)ip,
                   &in6addr.sin6_addr);
                   reinterpret_cast<struct sockaddr_in6*>(
                       _rep->address)->sin6_addr = in6addr.sin6_addr;
               }
           }
           else
           {
         reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_addr =         reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_addr =
             in6addr_any;             in6addr_any;
           }
         reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_family =         reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_family =
             AF_INET6;             AF_INET6;
         reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_port =         reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_port =
Line 336 
Line 376 
 #endif #endif
     else if(_connectionType == IPV4_CONNECTION)     else if(_connectionType == IPV4_CONNECTION)
     {     {
         reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_addr.s_addr =          if(_listenAddress)
             INADDR_ANY;          {
               String hostAdd = _listenAddress->getHost();
               CString ip = hostAdd.getCString();
               struct sockaddr_in addrs;
               HostAddress::convertTextToBinary(
                   AF_INET,
                   (const char*)ip,
                   &addrs.sin_addr);
               reinterpret_cast<struct sockaddr_in*>(
                   _rep->address)->sin_addr.s_addr = addrs.sin_addr.s_addr;
           }
           else
           {
               reinterpret_cast<struct sockaddr_in*>(
               _rep->address)->sin_addr.s_addr = INADDR_ANY;
           }
         reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_family =         reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_family =
             AF_INET;             AF_INET;
         reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_port =         reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_port =
Line 456 
Line 511 
     //     //
 #if !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) && \ #if !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) && \
      (defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || \      (defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || \        defined(PEGASUS_OS_ZOS) || \
       defined(PEGASUS_OS_PASE))       defined(PEGASUS_OS_PASE))
     if (_connectionType == LOCAL_CONNECTION)     if (_connectionType == LOCAL_CONNECTION)
     {     {
Line 467 
Line 522 
         {         {
             MessageLoaderParms parms(             MessageLoaderParms parms(
                 "Common.HTTPAcceptor.FAILED_SET_LDS_FILE_OPTION",                 "Common.HTTPAcceptor.FAILED_SET_LDS_FILE_OPTION",
                 "Failed to set permission on local domain socket {0}: {1}.",                  "Failed to set permission on local domain socket $0: $1.",
                 PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,                 PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,
                 PEGASUS_SYSTEM_ERRORMSG_NLS );                 PEGASUS_SYSTEM_ERRORMSG_NLS );
  
Line 486 
Line 541 
     {     {
         MessageLoaderParms parms(         MessageLoaderParms parms(
             "Common.HTTPAcceptor.FAILED_LISTEN_SOCKET",             "Common.HTTPAcceptor.FAILED_LISTEN_SOCKET",
             "Failed to listen on socket {0}: {1}.",              "Failed to listen on socket $0: $1.",
             (int)_rep->socket,PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS );             (int)_rep->socket,PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS );
  
         delete _rep;         delete _rep;
Line 534 
Line 589 
                 "HTTPAcceptor::closeConnectionSocket Unlinking local "                 "HTTPAcceptor::closeConnectionSocket Unlinking local "
                     "connection.");                     "connection.");
             ::unlink(             ::unlink(
                 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);                      reinterpret_cast<struct sockaddr_un*>
                           (_rep->address)->sun_path);
 #else #else
             PEGASUS_ASSERT(false);             PEGASUS_ASSERT(false);
 #endif #endif
Line 583 
Line 639 
                 "HTTPAcceptor::reconnectConnectionSocket Unlinking local "                 "HTTPAcceptor::reconnectConnectionSocket Unlinking local "
                     "connection." );                     "connection." );
             ::unlink(             ::unlink(
                 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);                      reinterpret_cast<struct sockaddr_un*>(
                           _rep->address)->sun_path);
 #else #else
             PEGASUS_ASSERT(false);             PEGASUS_ASSERT(false);
 #endif #endif
Line 630 
Line 687 
  
 void HTTPAcceptor::setSocketWriteTimeout(Uint32 socketWriteTimeout) void HTTPAcceptor::setSocketWriteTimeout(Uint32 socketWriteTimeout)
 { {
   #ifndef PEGASUS_INTEGERS_BOUNDARY_ALIGNED
       AutoMutex lock(_socketWriteTimeoutMutex);
   #endif
     _socketWriteTimeout = socketWriteTimeout;     _socketWriteTimeout = socketWriteTimeout;
 } }
  
 void HTTPAcceptor::setIdleConnectionTimeout(Uint32 idleConnectionTimeoutSeconds)  
 {  
     _idleConnectionTimeoutSeconds = idleConnectionTimeoutSeconds;  
 }  
   
 void HTTPAcceptor::unbind() void HTTPAcceptor::unbind()
 { {
     if (_rep)     if (_rep)
Line 649 
Line 704 
         {         {
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
             ::unlink(             ::unlink(
                 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);                      reinterpret_cast<struct sockaddr_un*>
                       (_rep->address)->sun_path);
 #else #else
             PEGASUS_ASSERT(false);             PEGASUS_ASSERT(false);
 #endif #endif
Line 857 
Line 913 
     socketPtr.release();     socketPtr.release();
  
     mp_socket->disableBlocking();     mp_socket->disableBlocking();
   
       {
   #ifndef PEGASUS_INTEGERS_BOUNDARY_ALIGNED
           AutoMutex lock(_socketWriteTimeoutMutex);
   #endif
     mp_socket->setSocketWriteTimeout(_socketWriteTimeout);     mp_socket->setSocketWriteTimeout(_socketWriteTimeout);
       }
  
     // Perform the SSL handshake, if applicable.     // Perform the SSL handshake, if applicable.
  
Line 879 
Line 941 
         this,         this,
         _outputMessageQueue));         _outputMessageQueue));
  
     if (_idleConnectionTimeoutSeconds)      if (HTTPConnection::getIdleConnectionTimeout())
     {     {
         connection->_idleConnectionTimeoutSeconds =  
             _idleConnectionTimeoutSeconds;  
         Time::gettimeofday(&connection->_idleStartTime);         Time::gettimeofday(&connection->_idleStartTime);
     }     }
  


Legend:
Removed from v.1.124  
changed lines
  Added in v.1.133

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2