version 1.42, 2003/10/15 10:58:25
|
version 1.48, 2004/05/12 14:32:54
|
|
|
//%///////////////////////////////////////////////////////////////////////////// |
//%2003//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM, |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development |
// The Open Group, Tivoli Systems |
// Company, L. P., IBM Corp., The Open Group, Tivoli Systems. |
|
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; |
|
// IBM Corp.; EMC Corporation, The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// 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) | // Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com) |
// Dave Rosckes (rosckes@us.ibm.com) | // Dave Rosckes (rosckes@us.ibm.com) |
|
// Denise Eckstein (denise.eckstein@hp.com) |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
else | else |
{ | { |
// ATTN! this can't happen! | // ATTN! this can't happen! |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::handleEnqueue: Invalid SOCKET_MESSAGE received."); |
} | } |
| |
break; | break; |
|
|
} | } |
} | } |
_rep->_connection_mut.unlock(); | _rep->_connection_mut.unlock(); |
|
break; |
} | } |
| |
default: | default: |
// ATTN: need unexpected message error! | // ATTN: need unexpected message error! |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::handleEnqueue: Invalid MESSAGE received."); |
break; | break; |
}; | }; |
| |
|
|
Message* message = dequeue(); | Message* message = dequeue(); |
| |
if (!message) | if (!message) |
|
{ |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::handleEnqueue(): No message on queue."); |
return; | return; |
|
} |
| |
handleEnqueue(message); | handleEnqueue(message); |
| |
|
|
MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND", | MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND", |
"HTTPAcceptor already bound"); | "HTTPAcceptor already bound"); |
| |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::bind: HTTPAcceptor already bound."); |
throw BindFailedException(parms); | throw BindFailedException(parms); |
} | } |
| |
|
|
//throw BindFailedException("Failed to create socket"); | //throw BindFailedException("Failed to create socket"); |
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_CREATE_SOCKET", | MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_CREATE_SOCKET", |
"Failed to create socket"); | "Failed to create socket"); |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_bind _rep->socket < 0"); |
throw BindFailedException(parms); | throw BindFailedException(parms); |
} | } |
| |
|
|
int sock_flags; | int sock_flags; |
if( (sock_flags = fcntl(_rep->socket, F_GETFD, 0)) < 0) | if( (sock_flags = fcntl(_rep->socket, F_GETFD, 0)) < 0) |
{ | { |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: fcntl(F_GETFD) failed"); |
"HTTPAcceptor::_bind: fcntl(F_GETFD) failed"); |
} | } |
else | else |
{ | { |
sock_flags |= FD_CLOEXEC; | sock_flags |= FD_CLOEXEC; |
if (fcntl(_rep->socket, F_SETFD, sock_flags) < 0) | if (fcntl(_rep->socket, F_SETFD, sock_flags) < 0) |
{ | { |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: fcntl(F_SETFD) failed"); |
"HTTPAcceptor::_bind: fcntl(F_SETFD) failed"); |
} | } |
} | } |
#endif | #endif |
|
|
//throw BindFailedException("Failed to set socket option"); | //throw BindFailedException("Failed to set socket option"); |
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION", | MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION", |
"Failed to set socket option"); | "Failed to set socket option"); |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_bind: Failed to set socket option."); |
throw BindFailedException(parms); | throw BindFailedException(parms); |
} | } |
| |
|
|
//throw BindFailedException("Failed to bind socket"); | //throw BindFailedException("Failed to bind socket"); |
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET", | MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET", |
"Failed to bind socket"); | "Failed to bind socket"); |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_bind: Failed to bind socket."); |
throw BindFailedException(parms); | throw BindFailedException(parms); |
} | } |
| |
// Set up listening on the given socket: | // Set up listening on the given socket: |
| |
int const MAX_CONNECTION_QUEUE_LENGTH = 5; |
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) |
{ | { |
|
|
//throw BindFailedException("Failed to bind socket"); | //throw BindFailedException("Failed to bind socket"); |
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET", | MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET", |
"Failed to bind socket"); | "Failed to bind socket"); |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_bind: Failed to bind socket(1)."); |
throw BindFailedException(parms); | throw BindFailedException(parms); |
} | } |
| |
|
|
//throw BindFailedException("Failed to solicit socket messaeges"); | //throw BindFailedException("Failed to solicit socket messaeges"); |
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES", | MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES", |
"Failed to solicit socket messaeges"); | "Failed to solicit socket messaeges"); |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_bind: Failed to solicit socket messages(2)."); |
throw BindFailedException(parms); | throw BindFailedException(parms); |
} | } |
} | } |
|
|
// close the socket | // close the socket |
Socket::close(_rep->socket); | Socket::close(_rep->socket); |
} | } |
|
else |
|
{ |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::closeConnectionSocket failure _rep is null." ); |
|
} |
} | } |
| |
/** | /** |
|
|
{ | { |
_bind(); | _bind(); |
} | } |
|
else |
|
{ |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::reopenConnectionSocket failure _rep is null." ); |
|
} |
} | } |
| |
/** | /** |
|
|
delete _rep; | delete _rep; |
_rep = 0; | _rep = 0; |
} | } |
|
else |
|
{ |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::unbind failure _rep is null." ); |
|
} |
} | } |
| |
void HTTPAcceptor::destroyConnections() | void HTTPAcceptor::destroyConnections() |
|
|
"HTTPAcceptor - accept() failure. errno: $0" | "HTTPAcceptor - accept() failure. errno: $0" |
,errno); | ,errno); |
| |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: accept() failed"); | "HTTPAcceptor: accept() failed"); |
return; | return; |
} | } |
|
|
int sock_flags; | int sock_flags; |
if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0) | if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0) |
{ | { |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: fcntl(F_GETFD) failed"); | "HTTPAcceptor: fcntl(F_GETFD) failed"); |
} | } |
else | else |
|
|
sock_flags |= FD_CLOEXEC; | sock_flags |= FD_CLOEXEC; |
if (fcntl(socket, F_SETFD, sock_flags) < 0) | if (fcntl(socket, F_SETFD, sock_flags) < 0) |
{ | { |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: fcntl(F_SETFD) failed"); | "HTTPAcceptor: fcntl(F_SETFD) failed"); |
} | } |
} | } |
|
|
| |
// 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); |
AutoPtr<MP_Socket> mp_socket(new MP_Socket(socket, _sslcontext)); |
if (mp_socket->accept() < 0) | if (mp_socket->accept() < 0) |
{ | { |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor: SSL_accept() failed"); | "HTTPAcceptor: SSL_accept() failed"); |
return; | return; |
} | } |
|
|
{ | { |
// ATTN-DE-P2-2003100503::TODO::Need to enhance code to return | // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return |
// an error message to Client application. | // an error message to Client application. |
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"HTTPAcceptor::_acceptConnection. Attempt to allocate entry in _entries table failed."); |
"HTTPAcceptor::_acceptConnection: Attempt to allocate entry in _entries table failed."); |
delete connection; | delete connection; |
Socket::close(socket); | Socket::close(socket); |
return; | return; |
} | } |
| |
|
mp_socket.release(); |
|
|
// Save the socket for cleanup later: | // Save the socket for cleanup later: |
connection->_entry_index = index; | connection->_entry_index = index; |
_rep->_connection_mut.lock(pegasus_thread_self()); | _rep->_connection_mut.lock(pegasus_thread_self()); |
|
|
else if( _sslcontext != 0 ) { | else if( _sslcontext != 0 ) { |
#ifdef PEGASUS_HAS_SSL | #ifdef PEGASUS_HAS_SSL |
ssl_socket_factory sf; | ssl_socket_factory sf; |
|
pegasus_socket temp(&sf, _sslcontext); |
#else | #else |
bsd_socket_factory sf; | bsd_socket_factory sf; |
#endif |
|
pegasus_socket temp(&sf); | pegasus_socket temp(&sf); |
|
#endif |
_listener = temp; | _listener = temp; |
_listener.socket(PF_INET, SOCK_STREAM, 0); | _listener.socket(PF_INET, SOCK_STREAM, 0); |
} | } |