version 1.13, 2002/03/30 00:02:02
|
version 1.17, 2002/05/22 05:25:30
|
|
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include "Config.h" | #include "Config.h" |
|
#include "Constants.h" |
#include <iostream> | #include <iostream> |
#include "Socket.h" | #include "Socket.h" |
| |
|
|
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
| |
HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueueService* outputMessageQueue) | HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueueService* outputMessageQueue) |
: Base("HTTPAcceptor", MessageQueue::getNextQueueId()), |
: Base(PEGASUS_QUEUENAME_HTTPACCEPTOR), |
_monitor(monitor), _outputMessageQueue(outputMessageQueue), | _monitor(monitor), _outputMessageQueue(outputMessageQueue), |
_rep(0), _sslcontext(NULL) | _rep(0), _sslcontext(NULL) |
{ | { |
|
|
| |
HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueueService* outputMessageQueue, | HTTPAcceptor::HTTPAcceptor(Monitor* monitor, MessageQueueService* outputMessageQueue, |
SSLContext * sslcontext) | SSLContext * sslcontext) |
: Base("HTTPAcceptor", MessageQueue::getNextQueueId()), |
: Base(PEGASUS_QUEUENAME_HTTPACCEPTOR), |
_monitor(monitor), _outputMessageQueue(outputMessageQueue), _rep(0), |
_monitor(monitor), _outputMessageQueue(outputMessageQueue), |
|
_rep(0), |
_sslcontext(sslcontext) | _sslcontext(sslcontext) |
{ | { |
Socket::initializeInterface(); | Socket::initializeInterface(); |
|
|
{ | { |
_monitor->unsolicitSocketMessages(socket); | _monitor->unsolicitSocketMessages(socket); |
_rep->connections.remove(i); | _rep->connections.remove(i); |
|
while (connection->refcount.value()) { } |
delete connection; | delete connection; |
break; | break; |
} | } |
|
|
| |
} | } |
| |
const char* HTTPAcceptor::getQueueName() const |
|
{ |
|
return "HTTPAcceptor"; |
|
} |
|
|
|
void HTTPAcceptor::bind(Uint32 portNumber) | void HTTPAcceptor::bind(Uint32 portNumber) |
{ | { |
if (_rep) | if (_rep) |
|
|
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; |
|
|
| |
// Destroy the connection (causing it to close): | // Destroy the connection (causing it to close): |
| |
|
while (connection->refcount.value()) { } |
delete connection; | delete connection; |
} | } |
| |
|
|
int n = sizeof(address); | int n = sizeof(address); |
#endif | #endif |
| |
#if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) || defined(PEGASUS_PLATFORM_LINUX_IA64_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 |
|
|
} | } |
| |
HTTPConnection* connection = new HTTPConnection( | HTTPConnection* connection = new HTTPConnection( |
_monitor, mp_socket, this, static_cast<MessageQueueService *>(_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); |