version 1.115, 2008/02/11 11:56:05
|
version 1.116, 2008/02/26 19:15:05
|
|
|
| |
~HTTPAcceptorRep() | ~HTTPAcceptorRep() |
{ | { |
|
closeSocket(); |
delete address; | delete address; |
} | } |
|
|
|
void closeSocket() |
|
{ |
|
Socket::close(socket); |
|
} |
|
|
struct sockaddr* address; | struct sockaddr* address; |
| |
SocketLength address_size; | SocketLength address_size; |
|
|
if (setsockopt(_rep->socket, SOL_SOCKET, SO_REUSEADDR, | if (setsockopt(_rep->socket, SOL_SOCKET, SO_REUSEADDR, |
(char *)&opt, sizeof(opt)) < 0) | (char *)&opt, sizeof(opt)) < 0) |
{ | { |
Socket::close(_rep->socket); |
|
delete _rep; | delete _rep; |
_rep = 0; | _rep = 0; |
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION", | MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION", |
|
|
"Failed to bind socket on port $0: $1.", | "Failed to bind socket on port $0: $1.", |
_portNumber, PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS); | _portNumber, PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS); |
| |
Socket::close(_rep->socket); |
|
delete _rep; | delete _rep; |
_rep = 0; | _rep = 0; |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, | PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
|
PEGASUS_LOCAL_DOMAIN_SOCKET_PATH, | PEGASUS_LOCAL_DOMAIN_SOCKET_PATH, |
PEGASUS_SYSTEM_ERRORMSG_NLS ); | PEGASUS_SYSTEM_ERRORMSG_NLS ); |
| |
Socket::close(_rep->socket); |
|
delete _rep; | delete _rep; |
_rep = 0; | _rep = 0; |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, | PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
|
"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 ); |
| |
Socket::close(_rep->socket); |
|
delete _rep; | delete _rep; |
_rep = 0; | _rep = 0; |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, | PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
|
getQueueId(), | getQueueId(), |
MonitorEntry::TYPE_ACCEPTOR))) | MonitorEntry::TYPE_ACCEPTOR))) |
{ | { |
Socket::close(_rep->socket); |
|
delete _rep; | delete _rep; |
_rep = 0; | _rep = 0; |
MessageLoaderParms parms( | MessageLoaderParms parms( |
|
|
//_monitor->unsolicitSocketMessages(_rep->socket); | //_monitor->unsolicitSocketMessages(_rep->socket); |
| |
// close the socket | // close the socket |
Socket::close(_rep->socket); |
_rep->closeSocket(); |
// Unlink Local Domain Socket Bug# 3312 | // Unlink Local Domain Socket Bug# 3312 |
if (_connectionType == LOCAL_CONNECTION) | if (_connectionType == LOCAL_CONNECTION) |
{ | { |
|
|
// unregister the socket | // unregister the socket |
_monitor->unsolicitSocketMessages(_rep->socket); | _monitor->unsolicitSocketMessages(_rep->socket); |
// close the socket | // close the socket |
Socket::close(_rep->socket); |
_rep->closeSocket(); |
// Unlink Local Domain Socket Bug# 3312 |
// Unlink Local Domain Socket |
if (_connectionType == LOCAL_CONNECTION) | if (_connectionType == LOCAL_CONNECTION) |
{ | { |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
|
|
if (_rep) | if (_rep) |
{ | { |
_portNumber = 0; | _portNumber = 0; |
Socket::close(_rep->socket); |
_rep->closeSocket(); |
| |
if (_connectionType == LOCAL_CONNECTION) | if (_connectionType == LOCAL_CONNECTION) |
{ | { |
|
|
"HTTPAcceptor: accept() failed"); | "HTTPAcceptor: accept() failed"); |
return; | return; |
} | } |
|
|
|
// Use an AutoPtr to ensure the socket handle is closed on exception |
|
AutoPtr<SocketHandle, CloseSocketHandle> socketPtr(&socket); |
|
|
#ifndef PEGASUS_OS_TYPE_WINDOWS | #ifndef PEGASUS_OS_TYPE_WINDOWS |
// We need to ensure that the socket number is not higher than | // We need to ensure that the socket number is not higher than |
// what fits into FD_SETSIZE, because we else won't be able to select on it | // what fits into FD_SETSIZE, because we else won't be able to select on it |
|
|
"accept() returned too large socket number %d.", | "accept() returned too large socket number %d.", |
socket)); | socket)); |
| |
// close the connection |
|
Socket::close(socket); |
|
return; | return; |
} | } |
#endif | #endif |
|
|
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, | PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: getnameinfo() failed"); | "HTTPAcceptor: getnameinfo() failed"); |
delete accept_address; | delete accept_address; |
Socket::close(socket); |
|
return; | return; |
} | } |
ipAddress = ipBuffer; | ipAddress = ipBuffer; |
|
|
| |
SharedPtr<MP_Socket> mp_socket(new MP_Socket( | SharedPtr<MP_Socket> mp_socket(new MP_Socket( |
socket, _sslcontext, _sslContextObjectLock, ipAddress)); | socket, _sslcontext, _sslContextObjectLock, ipAddress)); |
|
// mp_socket now has responsibility for closing the socket handle |
|
socketPtr.release(); |
| |
mp_socket->disableBlocking(); | mp_socket->disableBlocking(); |
mp_socket->setSocketWriteTimeout(_socketWriteTimeout); | mp_socket->setSocketWriteTimeout(_socketWriteTimeout); |
|
|
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, | PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: SSL_accept() failed"); | "HTTPAcceptor: SSL_accept() failed"); |
mp_socket->close(); |
|
return; | return; |
} | } |
| |
// 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, |
AutoPtr<HTTPConnection> connection(new HTTPConnection( |
ipAddress, this, static_cast<MessageQueue *>(_outputMessageQueue)); |
_monitor, |
|
mp_socket, |
|
ipAddress, |
|
this, |
|
static_cast<MessageQueue *>(_outputMessageQueue))); |
| |
if (_idleConnectionTimeoutSeconds) | if (_idleConnectionTimeoutSeconds) |
{ | { |
|
|
SocketMessage::READ | SocketMessage::EXCEPTION, | SocketMessage::READ | SocketMessage::EXCEPTION, |
connection->getQueueId(), MonitorEntry::TYPE_CONNECTION)) ) | connection->getQueueId(), MonitorEntry::TYPE_CONNECTION)) ) |
{ | { |
// ATTN-DE-P2-2003100503::TODO::Need to enhance code to return |
|
// an error message to Client application. |
|
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, | PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor::_acceptConnection: Attempt to allocate entry in " | "HTTPAcceptor::_acceptConnection: Attempt to allocate entry in " |
"_entries table failed."); | "_entries table failed."); |
delete connection; |
|
Socket::close(socket); |
|
return; | return; |
} | } |
| |
// Save the socket for cleanup later: |
|
connection->_entry_index = index; | connection->_entry_index = index; |
AutoMutex autoMut(_rep->_connection_mut); | AutoMutex autoMut(_rep->_connection_mut); |
_rep->connections.append(connection); |
_rep->connections.append(connection.get()); |
|
connection.release(); |
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |