Files
poco/Net/include/Poco/Net/HTTPObserver.h
sky92zwq 68616db653 Add an implementation of reactor http server (#4946)
* reactor http server

* fix

* test logic

* add reactor server session , use buf to cache socket buffer

* add reactor example

* fix: nodelay, otherwise ack will be after 50 ms

* tcp reactor server support multi listener

* fix: tcp reactor connection lifetime about socket

* feat: add tcp reactor params

* format

* check http reqeust complete, dynamic size buffer in reactor

* remove try catch

* remove debug logger

* remove debug logger

* fix: should not pop in destructor

* delete useless

* remove cankeepalive temporarily, optimize check complete req

* coding style

* coding style

* reactor server session unit test

* http reactor time server add delay param

* optimize switch case, and pop completed msg in destructor

* refactor reactor server session

* fix: check completed request when headers are in lower case like oha, add unit tests

* fix auto_ptr compile error, remove logger and coding style

* compile and tests fix, add reactor obj in makefile and vcxproj

* compile and tests fix in win, add reactor sample vcxproj

* compile and tests fix in macos when visibility is hidden
2025-09-30 14:41:30 +02:00

159 lines
3.8 KiB
C++

//
// HTTPObserver.h
//
// Library: Foundation
// Package: Net
// Module: HTTPObserver
//
// Definition of the HTTPObserver class template.
//
// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier: BSL-1.0
//
#ifndef Net_HTTPObserver_INCLUDED
#define Net_HTTPObserver_INCLUDED
#include "Poco/AbstractObserver.h"
#include "Poco/Mutex.h"
#include <memory>
namespace Poco {
namespace Net {
template <class C, class N>
class HTTPObserver: public AbstractObserver
/// This template class implements an adapter that sits between
/// a NotificationCenter and an object receiving notifications
/// from it. It is quite similar in concept to the
/// RunnableAdapter, but provides some NotificationCenter
/// specific additional methods.
/// See the NotificationCenter class for information on how
/// to use this template class.
///
/// This class template is quite similar to the Observer class
/// template. The differences are:
///
/// - HTTPObserver expects the callback function to accept a const AutoPtr&
/// instead of a plain pointer as argument, thus simplifying memory
/// management.
///
/// - HTTPObserver expects the object to accept a shared pointer.
///
/// - In addition to dispatching notifications based on the Notification runtime
/// type, HTTPObserver can also notify subscribers based on the Notification name.
/// To enable this functionality, a matcher function must be provided.
/// Null matcher means no matching is performed and all notificiations
/// of the type subscribed to are dispatched.
{
public:
using Type = HTTPObserver<C, N>;
using SharedPtrC = std::shared_ptr<C>;
using NotificationPtr = AutoPtr<N>;
using Callback = void (C::*)(const NotificationPtr&);
using Handler = Callback;
using Matcher = bool (C::*)(const std::string&) const;
HTTPObserver() = delete;
HTTPObserver(SharedPtrC object, Handler method, Matcher matcher = nullptr):
_pObject(object),
_handler(method),
_matcher(matcher)
{
}
HTTPObserver(const HTTPObserver& observer):
AbstractObserver(observer),
_pObject(observer._pObject),
_handler(observer._handler),
_matcher(observer._matcher)
{
}
~HTTPObserver()
{
}
HTTPObserver& operator = (const HTTPObserver& observer)
{
if (&observer != this)
{
_pObject = observer._pObject;
_handler = observer._handler;
_matcher = observer._matcher;
}
return *this;
}
virtual void notify(Notification* pNf) const
{
handle(NotificationPtr(static_cast<N*>(pNf), true));
}
virtual bool equals(const AbstractObserver& abstractObserver) const
{
const HTTPObserver* pObs = dynamic_cast<const HTTPObserver*>(&abstractObserver);
return pObs && pObs->_pObject == _pObject && pObs->_handler == _handler && pObs->_matcher == _matcher;
}
POCO_DEPRECATED("use `bool accepts(const Notification::Ptr&)` instead")
virtual bool accepts(Notification* pNf, const char* pName) const
{
return (!pName || pNf->name() == pName) && dynamic_cast<N*>(pNf) != nullptr;
}
virtual bool accepts(const Notification::Ptr& pNf) const
{
return (match(pNf) && (pNf.template cast<N>() != nullptr));
}
virtual AbstractObserver* clone() const
{
return new HTTPObserver(*this);
}
virtual void disable()
{
// do nothing
}
protected:
void handle(const NotificationPtr& ptr) const
{
Mutex::ScopedLock lock(_mutex);
if (_pObject)
(_pObject.get()->*_handler)(ptr);
}
bool match(const Notification::Ptr& ptr) const
{
Mutex::ScopedLock l(_mutex);
return _pObject && (!_matcher || (_pObject.get()->*_matcher)(ptr->name()));
}
Mutex& mutex() const
{
return _mutex;
}
private:
SharedPtrC _pObject;
Callback _handler;
Matcher _matcher;
mutable Poco::Mutex _mutex;
};
}} // namespace Poco:Net
#endif // Net_HTTPObserver_INCLUDED