summaryrefslogtreecommitdiff
path: root/indra/llmessage/lliohttpserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmessage/lliohttpserver.h')
-rw-r--r--indra/llmessage/lliohttpserver.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/indra/llmessage/lliohttpserver.h b/indra/llmessage/lliohttpserver.h
new file mode 100644
index 0000000000..05dfdc4bf7
--- /dev/null
+++ b/indra/llmessage/lliohttpserver.h
@@ -0,0 +1,95 @@
+/**
+ * @file lliohttpserver.h
+ * @brief Declaration of function for creating an HTTP wire server
+ * @see LLIOServerSocket, LLPumpIO
+ *
+ * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLIOHTTPSERVER_H
+#define LL_LLIOHTTPSERVER_H
+
+#include "llapr.h"
+#include "llchainio.h"
+#include "llhttpnode.h"
+
+class LLPumpIO;
+
+LLHTTPNode& LLCreateHTTPServer(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.
+ */
+
+void LLCreateHTTPPipe(LLPumpIO::chain_t& chain, const LLHTTPNode& root);
+ /**< 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.
+ */
+
+/* @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
+