/indra/llmessage/lliohttpserver.h
C++ Header | 139 lines | 48 code | 18 blank | 73 comment | 0 complexity | 5c452daf6a88efe33b4370f6cd70f6bd MD5 | raw file
Possible License(s): LGPL-2.1
- /**
- * @file lliohttpserver.h
- * @brief Declaration of function for creating an HTTP wire server
- * @see LLIOServerSocket, LLPumpIO
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
- #ifndef LL_LLIOHTTPSERVER_H
- #define LL_LLIOHTTPSERVER_H
- #include "llchainio.h"
- #include "llhttpnode.h"
- class LLPumpIO;
- // common strings use for populating the context. bascally 'request',
- // 'wildcard', and 'headers'.
- extern const std::string CONTEXT_REQUEST;
- extern const std::string CONTEXT_RESPONSE;
- extern const std::string CONTEXT_VERB;
- extern const std::string CONTEXT_HEADERS;
- extern const std::string HTTP_VERB_GET;
- extern const std::string HTTP_VERB_PUT;
- extern const std::string HTTP_VERB_POST;
- extern const std::string HTTP_VERB_DELETE;
- extern const std::string HTTP_VERB_OPTIONS;
- class LLIOHTTPServer
- {
- public:
- typedef void (*timing_callback_t)(const char* hashed_name, F32 time, void* data);
- static LLHTTPNode& create(apr_pool_t* pool, LLPumpIO& pump, U16 port);
- /**< Creates an HTTP wire server on the pump for the given TCP port.
- *
- * Returns the root node of the new server. Add LLHTTPNode instances
- * to this root.
- *
- * Nodes that return NULL for getProtocolHandler(), will use the
- * default handler that interprets HTTP on the wire and converts
- * it into calls to get(), put(), post(), del() with appropriate
- * LLSD arguments and results.
- *
- * To have nodes that implement some other wire protocol (XML-RPC
- * for example), use the helper templates below.
- */
-
- static void createPipe(LLPumpIO::chain_t& chain,
- const LLHTTPNode& root, const LLSD& ctx);
- /**< Create a pipe on the chain that handles HTTP requests.
- * The requests are served by the node tree given at root.
- *
- * This is primarily useful for unit testing.
- */
- static void setTimingCallback(timing_callback_t callback, void* data);
- /**< Register a callback function that will be called every time
- * a GET, PUT, POST, or DELETE is handled.
- *
- * This is used to time the LLHTTPNode handler code, which often hits
- * the database or does other, slow operations. JC
- */
- };
- /* @name Helper Templates
- *
- * These templates make it easy to create nodes that use thier own protocol
- * handlers rather than the default. Typically, you subclass LLIOPipe to
- * implement the protocol, and then add a node using the templates:
- *
- * rootNode->addNode("thing", new LLHTTPNodeForPipe<LLThingPipe>);
- *
- * The templates are:
- *
- * LLChainIOFactoryForPipe
- * - a simple factory that builds instances of a pipe
- *
- * LLHTTPNodeForFacotry
- * - a HTTP node that uses a factory as the protocol handler
- *
- * LLHTTPNodeForPipe
- * - a HTTP node that uses a simple factory based on a pipe
- */
- //@{
- template<class Pipe>
- class LLChainIOFactoryForPipe : public LLChainIOFactory
- {
- public:
- virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
- {
- chain.push_back(LLIOPipe::ptr_t(new Pipe));
- return true;
- }
- };
- template<class Factory>
- class LLHTTPNodeForFactory : public LLHTTPNode
- {
- public:
- const LLChainIOFactory* getProtocolHandler() const
- { return &mProtocolHandler; }
- private:
- Factory mProtocolHandler;
- };
- //@}
- template<class Pipe>
- class LLHTTPNodeForPipe : public LLHTTPNodeForFactory<
- LLChainIOFactoryForPipe<Pipe> >
- {
- };
- #endif // LL_LLIOHTTPSERVER_H