⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgiapp.hpp

📁 ncbi源码
💻 HPP
字号:
/* * =========================================================================== * PRODUCTION $Log: cgiapp.hpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 18:38:56  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41 * PRODUCTION * =========================================================================== */#ifndef CGI___CGIAPP__HPP#define CGI___CGIAPP__HPP/*  $Id: cgiapp.hpp,v 1000.2 2004/06/01 18:38:56 gouriano Exp $* ===========================================================================**                            PUBLIC DOMAIN NOTICE*               National Center for Biotechnology Information**  This software/database is a "United States Government Work" under the*  terms of the United States Copyright Act.  It was written as part of*  the author's official duties as a United States Government employee and*  thus cannot be copyrighted.  This software/database is freely available*  to the public for use. The National Library of Medicine and the U.S.*  Government have not placed any restriction on its use or reproduction.**  Although all reasonable efforts have been taken to ensure the accuracy*  and reliability of the software and data, the NLM and the U.S.*  Government do not and cannot warrant the performance or results that*  may be obtained by using this software or data. The NLM and the U.S.*  Government disclaim all warranties, express or implied, including*  warranties of performance, merchantability or fitness for any particular*  purpose.**  Please cite the author in any work or product based on this material.** ===========================================================================** Authors:*	Vsevolod Sandomirskiy, Aaron Ucko, Denis Vakatov, Anatoliy Kuznetsov** File Description:*   Base class for (Fast-)CGI applications*/#include <corelib/ncbiapp.hpp>#include <corelib/ncbireg.hpp>#include <corelib/ncbitime.hpp>#include <cgi/ncbicgi.hpp>#include <cgi/ncbicgir.hpp>#include <cgi/ncbires.hpp>#include <cgi/caf.hpp>/** @addtogroup CGIBase * * @{ */BEGIN_NCBI_SCOPEclass CCgiServerContext;class CCgiStatistics;class CCgiWatchFile;///////////////////////////////////////////////////////////////////////////////  CCgiApplication:://class NCBI_XCGI_EXPORT CCgiApplication : public CNcbiApplication{    friend class CCgiStatistics;    typedef CNcbiApplication CParent;public:    CCgiApplication(void);    ~CCgiApplication(void);    static CCgiApplication* Instance(void); // Singleton method    // These methods will throw exception if no server context set    const CCgiContext& GetContext(void) const  { return x_GetContext(); }    CCgiContext&       GetContext(void)        { return x_GetContext(); }    // These methods will throw exception if no resource is set    const CNcbiResource& GetResource(void) const { return x_GetResource(); }    CNcbiResource&       GetResource(void)       { return x_GetResource(); }    // 1-based for FastCGI (but 0 before the first iteration starts);    // always 0 for regular (i.e. not "fast") CGIs.    unsigned int GetFCgiIteration(void) const { return m_Iteration; }    // Return TRUE if it is running as a "fast" CGI    bool IsFastCGI(void) const;    virtual void Init(void);  // initialization    virtual void Exit(void);  // cleanup    virtual int Run(void);    virtual int ProcessRequest(CCgiContext& context) = 0;    virtual CNcbiResource*     LoadResource(void);    virtual CCgiServerContext* LoadServerContext(CCgiContext& context);    /// Set cgi parsing flag    /// @sa CCgiRequest::Flags    void SetRequestFlags(int flags) { m_RequestFlags = flags; }protected:    // Factory method for the Context object construction    virtual CCgiContext*   CreateContext(CNcbiArguments*   args = 0,                                         CNcbiEnvironment* env  = 0,                                         CNcbiIstream*     inp  = 0,                                         CNcbiOstream*     out  = 0,                                         int               ifd  = -1,                                         int               ofd  = -1);    // When an exception is thrown during the request processing,    // this method will be called. It will examine the exception "e" and    // maybe gather other useful info, and write it as HTTP response to "os".    // The returned value will be used as a CGI (or FCGI iteration's) exit code    // NOTE: Context and Resource are not valid at the time of this method call    // The default implementation prints out "e.what()" to "os" and then    // returns zero if the printout has got through, -1 otherwise.    virtual int            OnException(std::exception& e, CNcbiOstream& os);    void                   RegisterDiagFactory(const string& key,                                               CDiagFactory* fact);    CDiagFactory*          FindDiagFactory(const string& key);    virtual void           ConfigureDiagnostics    (CCgiContext& context);    virtual void           ConfigureDiagDestination(CCgiContext& context);    virtual void           ConfigureDiagThreshold  (CCgiContext& context);    virtual void           ConfigureDiagFormat     (CCgiContext& context);    // Analyze registry settings ([CGI] Log) and return current logging option    enum ELogOpt {        eNoLog,        eLog,        eLogOnError    };    ELogOpt GetLogOpt(void) const;    // Class factory for statistics class    virtual CCgiStatistics* CreateStat();    // Attach cookie affinity service interface. Pointer ownership goes to    // CCgiApplication    void SetCafService(CCookieAffinity* caf);private:    // If FastCGI-capable, and run as a Fast-CGI, then iterate through    // the FastCGI loop (doing initialization and running ProcessRequest()    // for each HTTP request);  then return TRUE.    // Return FALSE overwise.    // In the "result", return # of requests whose processing has failed    // (exception was thrown or ProcessRequest() returned non-zero value)    bool x_RunFastCGI(int* result, unsigned int def_iter = 10);    // Logging    enum ELogPostFlags {        fBegin = 0x1,        fEnd   = 0x2    };    typedef int TLogPostFlags;  // binary OR of "ELogPostFlags"    void x_LogPost(const char*             msg_header,                   unsigned int            iteration,                   const CTime&            start_time,                   const CNcbiEnvironment* env,                   TLogPostFlags           flags)        const;    // Add cookie with load balancer information    void x_AddLBCookie();    CCgiContext&   x_GetContext (void) const;    CNcbiResource& x_GetResource(void) const;    auto_ptr<CNcbiResource>   m_Resource;    auto_ptr<CCgiContext>     m_Context;    typedef map<string, CDiagFactory*> TDiagFactoryMap;    TDiagFactoryMap           m_DiagFactories;    auto_ptr<CCookieAffinity> m_Caf;         // Cookie affinity service pointer    char*                     m_HostIP;      // Cookie affinity host IP buffer    unsigned int              m_Iteration;   // (always 0 for plain CGI)    // Environment var. value to put to the diag.prefix;  [CGI].DiagPrefixEnv    string                    m_DiagPrefixEnv;    /// Bit flags for CCgiRequest    int                       m_RequestFlags;    // forbidden    CCgiApplication(const CCgiApplication&);    CCgiApplication& operator=(const CCgiApplication&);};///////////////////////////////////////////////////////////////////////////////  CCgiStatistics::////    CGI statistics information//class NCBI_XCGI_EXPORT CCgiStatistics{    friend class CCgiApplication;public:    virtual ~CCgiStatistics();protected:    CCgiStatistics(CCgiApplication& cgi_app);    // Reset statistics class. Method called only ones for CGI    // applications and every iteration if it is FastCGI.    virtual void Reset(const CTime& start_time,                       int          result,                       const std::exception*  ex = 0);    // Compose message for statistics logging.    // This default implementation constructs the message from the fragments    // composed with the help of "Compose_Xxx()" methods (see below).    // NOTE:  It can return empty string (when time cut-off is engaged).    virtual string Compose(void);    // Log the message    virtual void   Submit(const string& message);protected:    virtual string Compose_ProgramName (void);    virtual string Compose_Timing      (const CTime& end_time);    virtual string Compose_Entries     (void);    virtual string Compose_Result      (void);    virtual string Compose_ErrMessage  (void);protected:    CCgiApplication& m_CgiApp;     // Reference on the "mother app"    string           m_LogDelim;   // Log delimiter    CTime            m_StartTime;  // CGI start time    int              m_Result;     // Return code    string           m_ErrMsg;     // Error message};END_NCBI_SCOPE/* @} *//** ===========================================================================** $Log: cgiapp.hpp,v $* Revision 1000.2  2004/06/01 18:38:56  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41** Revision 1.41  2004/05/11 12:43:29  kuznets* Changes to control HTTP parsing (CCgiRequest flags)** Revision 1.40  2003/11/05 18:25:32  dicuccio* Added export specifiers.  Added private, unimplemented copy ctor/assignment* operator** Revision 1.39  2003/06/24 15:02:18  ucko* Prefix exception with std:: in OnException's declaration to avoid* possible clashes with the struct exception in Sun's <math.h>.** Revision 1.38  2003/05/21 17:38:04  vakatov*    CCgiApplication::x_RunFastCGI():  increased the default number of* FastCGI iterations from 3 to 10; also changed the meaning of the exit code.*    CCgiApplication::OnException():  new virtual method to handle* exception(s) -- allows sending the exception messages back to the HTTP* client and setting the exit code.*    CCgiApplication::x_FCGI_ShouldRestart():  moved to "fcgi_run.cpp".** Revision 1.37  2003/04/10 19:01:40  siyan* Added doxygen support** Revision 1.36  2003/03/24 16:14:11  ucko* New accessors GetFCgiIteration and IsFastCGI; new data member m_Iteration.** Revision 1.35  2003/03/03 16:36:33  kuznets* explicit use of std namespace when reffering exception** Revision 1.34  2003/02/27 17:55:05  ucko* +x_FCGI_ShouldRestart** Revision 1.33  2003/02/26 17:34:03  kuznets* CCgiStatistics::Reset changed to take exception as a parameter** Revision 1.32  2003/02/25 14:10:56  kuznets* Added support of CCookieAffinity service interface, host IP address, cookie encoding** Revision 1.31  2003/02/19 17:51:34  kuznets* Added generation of load balancing cookie** Revision 1.30  2003/02/05 01:21:43  ucko* "friend" -> "friend class" for GCC 3; CVS log -> end.** Revision 1.29  2003/02/04 21:27:13  kuznets* + Implementation of statistics logging** Revision 1.28  2003/01/23 19:58:40  kuznets* CGI logging improvements** Revision 1.27  2001/11/19 15:20:16  ucko* Switch CGI stuff to new diagnostics interface.** Revision 1.26  2001/10/31 15:30:19  golikov* warning removed** Revision 1.25  2001/10/17 14:18:04  ucko* Add CCgiApplication::SetCgiDiagHandler for the benefit of derived* classes that overload ConfigureDiagDestination.** Revision 1.24  2001/10/05 14:56:20  ucko* Minor interface tweaks for CCgiStreamDiagHandler and descendants.** Revision 1.23  2001/10/04 18:17:51  ucko* Accept additional query parameters for more flexible diagnostics.* Support checking the readiness of CGI input and output streams.** Revision 1.22  2001/06/13 21:04:35  vakatov* Formal improvements and general beautifications of the CGI lib sources.** Revision 1.21  2001/01/12 21:58:25  golikov* cgicontext available from cgiapp** Revision 1.20  2000/01/20 17:54:55  vakatov* CCgiApplication:: constructor to get CNcbiArguments, and not raw argc/argv.* SetupDiag_AppSpecific() to override the one from CNcbiApplication:: -- lest* to write the diagnostics to the standard output.** Revision 1.19  1999/12/17 04:06:20  vakatov* Added CCgiApplication::RunFastCGI()** Revision 1.18  1999/11/15 15:53:19  sandomir* Registry support moved from CCgiApplication to CNcbiApplication** Revision 1.17  1999/05/14 19:21:48  pubmed* myncbi - initial version; minor changes in CgiContext, history, query** Revision 1.15  1999/05/06 20:32:47  pubmed* CNcbiResource -> CNcbiDbResource; utils from query; few more context methods** Revision 1.14  1999/04/30 16:38:08  vakatov* #include <ncbireg.hpp> to provide CNcbiRegistry class definition(see R1.13)** Revision 1.13  1999/04/27 17:01:23  vakatov* #include <ncbires.hpp> to provide CNcbiResource class definition* for the "auto_ptr<CNcbiResource>" (required by "delete" under MSVC++)** Revision 1.12  1999/04/27 14:49:46  vasilche* Added FastCGI interface.* CNcbiContext renamed to CCgiContext.** Revision 1.11  1999/02/22 21:12:37  sandomir* MsgRequest -> NcbiContext** Revision 1.10  1998/12/28 23:28:59  vakatov* New CVS and development tree structure for the NCBI C++ projects** Revision 1.9  1998/12/28 15:43:09  sandomir* minor fixed in CgiApp and Resource** Revision 1.8  1998/12/10 17:36:54  sandomir* ncbires.cpp added** Revision 1.7  1998/12/09 22:59:05  lewisg* use new cgiapp class** Revision 1.6  1998/12/09 17:27:44  sandomir* tool should be changed to work with the new CCgiApplication** Revision 1.5  1998/12/09 16:49:55  sandomir* CCgiApplication added** Revision 1.1  1998/12/03 21:24:21  sandomir* NcbiApplication and CgiApplication updated** Revision 1.3  1998/12/01 19:12:36  lewisg* added CCgiApplication** Revision 1.2  1998/11/05 21:45:13  sandomir* std:: deleted** Revision 1.1  1998/11/02 22:10:12  sandomir* CNcbiApplication added; netest sample updated** ===========================================================================*/#endif // CGI___CGIAPP__HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -