140 lines
4.1 KiB
C++
140 lines
4.1 KiB
C++
/**
|
|
* @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(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
|
|
|