lliohttpserver.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lliohttpserver.h
  3.  * @brief Declaration of function for creating an HTTP wire server
  4.  * @see LLIOServerSocket, LLPumpIO
  5.  *
  6.  * $LicenseInfo:firstyear=2005&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2005-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #ifndef LL_LLIOHTTPSERVER_H
  34. #define LL_LLIOHTTPSERVER_H
  35. #include "llchainio.h"
  36. #include "llhttpnode.h"
  37. class LLPumpIO;
  38. // common strings use for populating the context. bascally 'request',
  39. // 'wildcard', and 'headers'.
  40. extern const std::string CONTEXT_REQUEST;
  41. extern const std::string CONTEXT_RESPONSE;
  42. extern const std::string CONTEXT_VERB;
  43. extern const std::string CONTEXT_HEADERS;
  44. extern const std::string HTTP_VERB_GET;
  45. extern const std::string HTTP_VERB_PUT;
  46. extern const std::string HTTP_VERB_POST;
  47. extern const std::string HTTP_VERB_DELETE;
  48. extern const std::string HTTP_VERB_OPTIONS;
  49. class LLIOHTTPServer
  50. {
  51. public:
  52. typedef void (*timing_callback_t)(const char* hashed_name, F32 time, void* data);
  53. static LLHTTPNode& create(apr_pool_t* pool, LLPumpIO& pump, U16 port);
  54. /**< Creates an HTTP wire server on the pump for the given TCP port.
  55.  *
  56.  *   Returns the root node of the new server.  Add LLHTTPNode instances
  57.  *   to this root.
  58.  *
  59.  *   Nodes that return NULL for getProtocolHandler(), will use the
  60.  *   default handler that interprets HTTP on the wire and converts
  61.  *   it into calls to get(), put(), post(), del() with appropriate
  62.  *   LLSD arguments and results.
  63.  *
  64.  *   To have nodes that implement some other wire protocol (XML-RPC
  65.  *   for example), use the helper templates below.
  66.  */
  67.  
  68. static void createPipe(LLPumpIO::chain_t& chain, 
  69.             const LLHTTPNode& root, const LLSD& ctx);
  70. /**< Create a pipe on the chain that handles HTTP requests.
  71.  *   The requests are served by the node tree given at root.
  72.  *
  73.  *   This is primarily useful for unit testing.
  74.  */
  75. static void setTimingCallback(timing_callback_t callback, void* data);
  76. /**< Register a callback function that will be called every time
  77. *    a GET, PUT, POST, or DELETE is handled.
  78. *
  79. * This is used to time the LLHTTPNode handler code, which often hits
  80. * the database or does other, slow operations. JC
  81. */
  82. };
  83. /* @name Helper Templates
  84.  *
  85.  * These templates make it easy to create nodes that use thier own protocol
  86.  * handlers rather than the default.  Typically, you subclass LLIOPipe to
  87.  * implement the protocol, and then add a node using the templates:
  88.  *
  89.  * rootNode->addNode("thing", new LLHTTPNodeForPipe<LLThingPipe>);
  90.  *
  91.  * The templates are:
  92.  *
  93.  *  LLChainIOFactoryForPipe
  94.  *  - a simple factory that builds instances of a pipe
  95.  *
  96.  *  LLHTTPNodeForFacotry
  97.  *  - a HTTP node that uses a factory as the protocol handler
  98.  *
  99.  *  LLHTTPNodeForPipe
  100.  *  - a HTTP node that uses a simple factory based on a pipe
  101.  */
  102. //@{
  103. template<class Pipe>
  104. class LLChainIOFactoryForPipe : public LLChainIOFactory
  105. {
  106. public:
  107. virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
  108. {   
  109. chain.push_back(LLIOPipe::ptr_t(new Pipe));
  110. return true;
  111. }
  112. };
  113. template<class Factory>
  114. class LLHTTPNodeForFactory : public LLHTTPNode
  115. {
  116. public:
  117. const LLChainIOFactory* getProtocolHandler() const
  118. { return &mProtocolHandler; }
  119. private:
  120. Factory mProtocolHandler;
  121. };
  122. //@}
  123. template<class Pipe>
  124. class LLHTTPNodeForPipe : public LLHTTPNodeForFactory<
  125.    LLChainIOFactoryForPipe<Pipe> >
  126. {
  127. };
  128. #endif // LL_LLIOHTTPSERVER_H