cgiapp.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:14k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cgiapp.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:38:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CGI___CGIAPP__HPP
  10. #define CGI___CGIAPP__HPP
  11. /*  $Id: cgiapp.hpp,v 1000.2 2004/06/01 18:38:56 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Authors:
  37. * Vsevolod Sandomirskiy, Aaron Ucko, Denis Vakatov, Anatoliy Kuznetsov
  38. *
  39. * File Description:
  40. *   Base class for (Fast-)CGI applications
  41. */
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <corelib/ncbitime.hpp>
  45. #include <cgi/ncbicgi.hpp>
  46. #include <cgi/ncbicgir.hpp>
  47. #include <cgi/ncbires.hpp>
  48. #include <cgi/caf.hpp>
  49. /** @addtogroup CGIBase
  50.  *
  51.  * @{
  52.  */
  53. BEGIN_NCBI_SCOPE
  54. class CCgiServerContext;
  55. class CCgiStatistics;
  56. class CCgiWatchFile;
  57. /////////////////////////////////////////////////////////////////////////////
  58. //  CCgiApplication::
  59. //
  60. class NCBI_XCGI_EXPORT CCgiApplication : public CNcbiApplication
  61. {
  62.     friend class CCgiStatistics;
  63.     typedef CNcbiApplication CParent;
  64. public:
  65.     CCgiApplication(void);
  66.     ~CCgiApplication(void);
  67.     static CCgiApplication* Instance(void); // Singleton method
  68.     // These methods will throw exception if no server context set
  69.     const CCgiContext& GetContext(void) const  { return x_GetContext(); }
  70.     CCgiContext&       GetContext(void)        { return x_GetContext(); }
  71.     // These methods will throw exception if no resource is set
  72.     const CNcbiResource& GetResource(void) const { return x_GetResource(); }
  73.     CNcbiResource&       GetResource(void)       { return x_GetResource(); }
  74.     // 1-based for FastCGI (but 0 before the first iteration starts);
  75.     // always 0 for regular (i.e. not "fast") CGIs.
  76.     unsigned int GetFCgiIteration(void) const { return m_Iteration; }
  77.     // Return TRUE if it is running as a "fast" CGI
  78.     bool IsFastCGI(void) const;
  79.     virtual void Init(void);  // initialization
  80.     virtual void Exit(void);  // cleanup
  81.     virtual int Run(void);
  82.     virtual int ProcessRequest(CCgiContext& context) = 0;
  83.     virtual CNcbiResource*     LoadResource(void);
  84.     virtual CCgiServerContext* LoadServerContext(CCgiContext& context);
  85.     /// Set cgi parsing flag
  86.     /// @sa CCgiRequest::Flags
  87.     void SetRequestFlags(int flags) { m_RequestFlags = flags; }
  88. protected:
  89.     // Factory method for the Context object construction
  90.     virtual CCgiContext*   CreateContext(CNcbiArguments*   args = 0,
  91.                                          CNcbiEnvironment* env  = 0,
  92.                                          CNcbiIstream*     inp  = 0,
  93.                                          CNcbiOstream*     out  = 0,
  94.                                          int               ifd  = -1,
  95.                                          int               ofd  = -1);
  96.     // When an exception is thrown during the request processing,
  97.     // this method will be called. It will examine the exception "e" and
  98.     // maybe gather other useful info, and write it as HTTP response to "os".
  99.     // The returned value will be used as a CGI (or FCGI iteration's) exit code
  100.     // NOTE: Context and Resource are not valid at the time of this method call
  101.     // The default implementation prints out "e.what()" to "os" and then
  102.     // returns zero if the printout has got through, -1 otherwise.
  103.     virtual int            OnException(std::exception& e, CNcbiOstream& os);
  104.     void                   RegisterDiagFactory(const string& key,
  105.                                                CDiagFactory* fact);
  106.     CDiagFactory*          FindDiagFactory(const string& key);
  107.     virtual void           ConfigureDiagnostics    (CCgiContext& context);
  108.     virtual void           ConfigureDiagDestination(CCgiContext& context);
  109.     virtual void           ConfigureDiagThreshold  (CCgiContext& context);
  110.     virtual void           ConfigureDiagFormat     (CCgiContext& context);
  111.     // Analyze registry settings ([CGI] Log) and return current logging option
  112.     enum ELogOpt {
  113.         eNoLog,
  114.         eLog,
  115.         eLogOnError
  116.     };
  117.     ELogOpt GetLogOpt(void) const;
  118.     // Class factory for statistics class
  119.     virtual CCgiStatistics* CreateStat();
  120.     // Attach cookie affinity service interface. Pointer ownership goes to
  121.     // CCgiApplication
  122.     void SetCafService(CCookieAffinity* caf);
  123. private:
  124.     // If FastCGI-capable, and run as a Fast-CGI, then iterate through
  125.     // the FastCGI loop (doing initialization and running ProcessRequest()
  126.     // for each HTTP request);  then return TRUE.
  127.     // Return FALSE overwise.
  128.     // In the "result", return # of requests whose processing has failed
  129.     // (exception was thrown or ProcessRequest() returned non-zero value)
  130.     bool x_RunFastCGI(int* result, unsigned int def_iter = 10);
  131.     // Logging
  132.     enum ELogPostFlags {
  133.         fBegin = 0x1,
  134.         fEnd   = 0x2
  135.     };
  136.     typedef int TLogPostFlags;  // binary OR of "ELogPostFlags"
  137.     void x_LogPost(const char*             msg_header,
  138.                    unsigned int            iteration,
  139.                    const CTime&            start_time,
  140.                    const CNcbiEnvironment* env,
  141.                    TLogPostFlags           flags)
  142.         const;
  143.     // Add cookie with load balancer information
  144.     void x_AddLBCookie();
  145.     CCgiContext&   x_GetContext (void) const;
  146.     CNcbiResource& x_GetResource(void) const;
  147.     auto_ptr<CNcbiResource>   m_Resource;
  148.     auto_ptr<CCgiContext>     m_Context;
  149.     typedef map<string, CDiagFactory*> TDiagFactoryMap;
  150.     TDiagFactoryMap           m_DiagFactories;
  151.     auto_ptr<CCookieAffinity> m_Caf;         // Cookie affinity service pointer
  152.     char*                     m_HostIP;      // Cookie affinity host IP buffer
  153.     unsigned int              m_Iteration;   // (always 0 for plain CGI)
  154.     // Environment var. value to put to the diag.prefix;  [CGI].DiagPrefixEnv
  155.     string                    m_DiagPrefixEnv;
  156.     /// Bit flags for CCgiRequest
  157.     int                       m_RequestFlags;
  158.     // forbidden
  159.     CCgiApplication(const CCgiApplication&);
  160.     CCgiApplication& operator=(const CCgiApplication&);
  161. };
  162. /////////////////////////////////////////////////////////////////////////////
  163. //  CCgiStatistics::
  164. //
  165. //    CGI statistics information
  166. //
  167. class NCBI_XCGI_EXPORT CCgiStatistics
  168. {
  169.     friend class CCgiApplication;
  170. public:
  171.     virtual ~CCgiStatistics();
  172. protected:
  173.     CCgiStatistics(CCgiApplication& cgi_app);
  174.     // Reset statistics class. Method called only ones for CGI
  175.     // applications and every iteration if it is FastCGI.
  176.     virtual void Reset(const CTime& start_time,
  177.                        int          result,
  178.                        const std::exception*  ex = 0);
  179.     // Compose message for statistics logging.
  180.     // This default implementation constructs the message from the fragments
  181.     // composed with the help of "Compose_Xxx()" methods (see below).
  182.     // NOTE:  It can return empty string (when time cut-off is engaged).
  183.     virtual string Compose(void);
  184.     // Log the message
  185.     virtual void   Submit(const string& message);
  186. protected:
  187.     virtual string Compose_ProgramName (void);
  188.     virtual string Compose_Timing      (const CTime& end_time);
  189.     virtual string Compose_Entries     (void);
  190.     virtual string Compose_Result      (void);
  191.     virtual string Compose_ErrMessage  (void);
  192. protected:
  193.     CCgiApplication& m_CgiApp;     // Reference on the "mother app"
  194.     string           m_LogDelim;   // Log delimiter
  195.     CTime            m_StartTime;  // CGI start time
  196.     int              m_Result;     // Return code
  197.     string           m_ErrMsg;     // Error message
  198. };
  199. END_NCBI_SCOPE
  200. /* @} */
  201. /*
  202. * ===========================================================================
  203. *
  204. * $Log: cgiapp.hpp,v $
  205. * Revision 1000.2  2004/06/01 18:38:56  gouriano
  206. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41
  207. *
  208. * Revision 1.41  2004/05/11 12:43:29  kuznets
  209. * Changes to control HTTP parsing (CCgiRequest flags)
  210. *
  211. * Revision 1.40  2003/11/05 18:25:32  dicuccio
  212. * Added export specifiers.  Added private, unimplemented copy ctor/assignment
  213. * operator
  214. *
  215. * Revision 1.39  2003/06/24 15:02:18  ucko
  216. * Prefix exception with std:: in OnException's declaration to avoid
  217. * possible clashes with the struct exception in Sun's <math.h>.
  218. *
  219. * Revision 1.38  2003/05/21 17:38:04  vakatov
  220. *    CCgiApplication::x_RunFastCGI():  increased the default number of
  221. * FastCGI iterations from 3 to 10; also changed the meaning of the exit code.
  222. *    CCgiApplication::OnException():  new virtual method to handle
  223. * exception(s) -- allows sending the exception messages back to the HTTP
  224. * client and setting the exit code.
  225. *    CCgiApplication::x_FCGI_ShouldRestart():  moved to "fcgi_run.cpp".
  226. *
  227. * Revision 1.37  2003/04/10 19:01:40  siyan
  228. * Added doxygen support
  229. *
  230. * Revision 1.36  2003/03/24 16:14:11  ucko
  231. * New accessors GetFCgiIteration and IsFastCGI; new data member m_Iteration.
  232. *
  233. * Revision 1.35  2003/03/03 16:36:33  kuznets
  234. * explicit use of std namespace when reffering exception
  235. *
  236. * Revision 1.34  2003/02/27 17:55:05  ucko
  237. * +x_FCGI_ShouldRestart
  238. *
  239. * Revision 1.33  2003/02/26 17:34:03  kuznets
  240. * CCgiStatistics::Reset changed to take exception as a parameter
  241. *
  242. * Revision 1.32  2003/02/25 14:10:56  kuznets
  243. * Added support of CCookieAffinity service interface, host IP address, cookie encoding
  244. *
  245. * Revision 1.31  2003/02/19 17:51:34  kuznets
  246. * Added generation of load balancing cookie
  247. *
  248. * Revision 1.30  2003/02/05 01:21:43  ucko
  249. * "friend" -> "friend class" for GCC 3; CVS log -> end.
  250. *
  251. * Revision 1.29  2003/02/04 21:27:13  kuznets
  252. * + Implementation of statistics logging
  253. *
  254. * Revision 1.28  2003/01/23 19:58:40  kuznets
  255. * CGI logging improvements
  256. *
  257. * Revision 1.27  2001/11/19 15:20:16  ucko
  258. * Switch CGI stuff to new diagnostics interface.
  259. *
  260. * Revision 1.26  2001/10/31 15:30:19  golikov
  261. * warning removed
  262. *
  263. * Revision 1.25  2001/10/17 14:18:04  ucko
  264. * Add CCgiApplication::SetCgiDiagHandler for the benefit of derived
  265. * classes that overload ConfigureDiagDestination.
  266. *
  267. * Revision 1.24  2001/10/05 14:56:20  ucko
  268. * Minor interface tweaks for CCgiStreamDiagHandler and descendants.
  269. *
  270. * Revision 1.23  2001/10/04 18:17:51  ucko
  271. * Accept additional query parameters for more flexible diagnostics.
  272. * Support checking the readiness of CGI input and output streams.
  273. *
  274. * Revision 1.22  2001/06/13 21:04:35  vakatov
  275. * Formal improvements and general beautifications of the CGI lib sources.
  276. *
  277. * Revision 1.21  2001/01/12 21:58:25  golikov
  278. * cgicontext available from cgiapp
  279. *
  280. * Revision 1.20  2000/01/20 17:54:55  vakatov
  281. * CCgiApplication:: constructor to get CNcbiArguments, and not raw argc/argv.
  282. * SetupDiag_AppSpecific() to override the one from CNcbiApplication:: -- lest
  283. * to write the diagnostics to the standard output.
  284. *
  285. * Revision 1.19  1999/12/17 04:06:20  vakatov
  286. * Added CCgiApplication::RunFastCGI()
  287. *
  288. * Revision 1.18  1999/11/15 15:53:19  sandomir
  289. * Registry support moved from CCgiApplication to CNcbiApplication
  290. *
  291. * Revision 1.17  1999/05/14 19:21:48  pubmed
  292. * myncbi - initial version; minor changes in CgiContext, history, query
  293. *
  294. * Revision 1.15  1999/05/06 20:32:47  pubmed
  295. * CNcbiResource -> CNcbiDbResource; utils from query; few more context methods
  296. *
  297. * Revision 1.14  1999/04/30 16:38:08  vakatov
  298. * #include <ncbireg.hpp> to provide CNcbiRegistry class definition(see R1.13)
  299. *
  300. * Revision 1.13  1999/04/27 17:01:23  vakatov
  301. * #include <ncbires.hpp> to provide CNcbiResource class definition
  302. * for the "auto_ptr<CNcbiResource>" (required by "delete" under MSVC++)
  303. *
  304. * Revision 1.12  1999/04/27 14:49:46  vasilche
  305. * Added FastCGI interface.
  306. * CNcbiContext renamed to CCgiContext.
  307. *
  308. * Revision 1.11  1999/02/22 21:12:37  sandomir
  309. * MsgRequest -> NcbiContext
  310. *
  311. * Revision 1.10  1998/12/28 23:28:59  vakatov
  312. * New CVS and development tree structure for the NCBI C++ projects
  313. *
  314. * Revision 1.9  1998/12/28 15:43:09  sandomir
  315. * minor fixed in CgiApp and Resource
  316. *
  317. * Revision 1.8  1998/12/10 17:36:54  sandomir
  318. * ncbires.cpp added
  319. *
  320. * Revision 1.7  1998/12/09 22:59:05  lewisg
  321. * use new cgiapp class
  322. *
  323. * Revision 1.6  1998/12/09 17:27:44  sandomir
  324. * tool should be changed to work with the new CCgiApplication
  325. *
  326. * Revision 1.5  1998/12/09 16:49:55  sandomir
  327. * CCgiApplication added
  328. *
  329. * Revision 1.1  1998/12/03 21:24:21  sandomir
  330. * NcbiApplication and CgiApplication updated
  331. *
  332. * Revision 1.3  1998/12/01 19:12:36  lewisg
  333. * added CCgiApplication
  334. *
  335. * Revision 1.2  1998/11/05 21:45:13  sandomir
  336. * std:: deleted
  337. *
  338. * Revision 1.1  1998/11/02 22:10:12  sandomir
  339. * CNcbiApplication added; netest sample updated
  340. *
  341. * ===========================================================================
  342. */
  343. #endif // CGI___CGIAPP__HPP