diff options
Diffstat (limited to 'lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h')
-rw-r--r-- | lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h new file mode 100644 index 0000000..dc5cbd3 --- /dev/null +++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h @@ -0,0 +1,163 @@ +/***************************************************************** +| +| Platinum - HTTP Server Tasks +| +| Copyright (c) 2004-2010, Plutinosoft, LLC. +| All rights reserved. +| http://www.plutinosoft.com +| +| This program is free software; you can redistribute it and/or +| modify it under the terms of the GNU General Public License +| as published by the Free Software Foundation; either version 2 +| of the License, or (at your option) any later version. +| +| OEMs, ISVs, VARs and other distributors that combine and +| distribute commercially licensed software with Platinum software +| and do not wish to distribute the source code for the commercially +| licensed software under version 2, or (at your option) any later +| version, of the GNU General Public License (the "GPL") must enter +| into a commercial license agreement with Plutinosoft, LLC. +| licensing@plutinosoft.com +| +| This program is distributed in the hope that it will be useful, +| but WITHOUT ANY WARRANTY; without even the implied warranty of +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +| GNU General Public License for more details. +| +| You should have received a copy of the GNU General Public License +| along with this program; see the file LICENSE.txt. If not, write to +| the Free Software Foundation, Inc., +| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +| http://www.gnu.org/licenses/gpl-2.0.html +| +****************************************************************/ + +/** @file + HTTP Server Tasks + */ + +#ifndef _PLT_HTTP_SERVER_TASK_H_ +#define _PLT_HTTP_SERVER_TASK_H_ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "Neptune.h" +#include "PltHttp.h" +#include "PltDatagramStream.h" +#include "PltThreadTask.h" + +/*---------------------------------------------------------------------- +| PLT_HttpServerSocketTask class ++---------------------------------------------------------------------*/ +/** + The PLT_HttpServerSocketTask class is a task used for handling one or more HTTP + requests from a client. It is created by a PLT_HttpListenTask instance upon + receiving a connection request. A PLT_HttpServer will handle the delegation for + setting up the HTTP response. + */ +class PLT_HttpServerSocketTask : public PLT_ThreadTask +{ + friend class PLT_ThreadTask; + +public: + PLT_HttpServerSocketTask(NPT_Socket* socket, bool stay_alive_forever = false); + +protected: + ~PLT_HttpServerSocketTask() override; + +protected: + // Request callback handler + virtual NPT_Result SetupResponse(NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse& response) = 0; + + // overridables + virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream); + virtual NPT_Result GetInfo(NPT_SocketInfo& info); + + // PLT_ThreadTask methods + void DoAbort() override { if (m_Socket) m_Socket->Cancel(); } + void DoRun() override; + +private: + virtual NPT_Result Read(NPT_BufferedInputStreamReference& buffered_input_stream, + NPT_HttpRequest*& request, + NPT_HttpRequestContext* context = NULL); + virtual NPT_Result Write(NPT_HttpResponse* response, + bool& keep_alive, + bool headers_only = false); + virtual NPT_Result RespondToClient(NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse*& response); + virtual NPT_Result SendResponseHeaders(NPT_HttpResponse* response, + NPT_OutputStream& output_stream, + bool& keep_alive); + virtual NPT_Result SendResponseBody(NPT_HttpResponse* response, + NPT_OutputStream& output_stream); + +protected: + NPT_Socket* m_Socket; + bool m_StayAliveForever; +}; + +/*---------------------------------------------------------------------- +| PLT_HttpServerTask class ++---------------------------------------------------------------------*/ +/** + The PLT_HttpServerTask class is a version of PLT_HttpServerSocketTask that supports + delegation of HTTP request handling. + */ +class PLT_HttpServerTask : public PLT_HttpServerSocketTask +{ +public: + PLT_HttpServerTask(NPT_HttpRequestHandler* handler, + NPT_Socket* socket, + bool keep_alive = false) : + PLT_HttpServerSocketTask(socket, keep_alive), m_Handler(handler) {} + +protected: + ~PLT_HttpServerTask() override {} + + NPT_Result SetupResponse(NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse& response) override { + return m_Handler->SetupResponse(request, context, response); + } + +protected: + NPT_HttpRequestHandler* m_Handler; +}; + +/*---------------------------------------------------------------------- +| PLT_HttpListenTask class ++---------------------------------------------------------------------*/ +/** + The PLT_HttpListenTask class is used by a PLT_HttpServer to listen for incoming + connections and spawn a new task for handling each request. + */ +class PLT_HttpListenTask : public PLT_ThreadTask +{ +public: + PLT_HttpListenTask(NPT_HttpRequestHandler* handler, + NPT_TcpServerSocket* socket, + bool owns_socket = true) : + m_Handler(handler), m_Socket(socket), m_OwnsSocket(owns_socket) {} + +protected: + ~PLT_HttpListenTask() override { + if (m_OwnsSocket && m_Socket) delete m_Socket; + } + +protected: + // PLT_ThreadTask methods + void DoAbort() override { if (m_Socket) m_Socket->Cancel(); } + void DoRun() override; + +protected: + NPT_HttpRequestHandler* m_Handler; + NPT_TcpServerSocket* m_Socket; + bool m_OwnsSocket; +}; + +#endif /* _PLT_HTTP_SERVER_TASK_H_ */ |