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

📄 cgictx.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: cgictx.cpp,v $ * PRODUCTION Revision 1000.1  2004/06/01 18:39:10  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.37 * PRODUCTION * =========================================================================== *//*  $Id: cgictx.cpp,v 1000.1 2004/06/01 18:39:10 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.** ===========================================================================** Author: Eugene Vasilchenko** File Description:*   Definition CGI application class and its context class.**/#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <corelib/ncbireg.hpp>#include <cgi/ncbires.hpp>#include <cgi/cgictx.hpp>#include <cgi/cgiapp.hpp>#ifdef NCBI_OS_UNIX#  ifdef _AIX32 // version 3.2 *or higher*#    include <strings.h> // needed for bzero()#  endif#  include <sys/time.h>#  include <unistd.h> // needed for select() on some platforms#endifBEGIN_NCBI_SCOPE///////////////////////////////////////////////////////////////////////////////  CCgiServerContext:://CCgiServerContext::~CCgiServerContext(void){    return;}///////////////////////////////////////////////////////////////////////////////  CCtxMsg:://CCtxMsg::~CCtxMsg(void){    return;}///////////////////////////////////////////////////////////////////////////////  CCtxMsgString:://string CCtxMsgString::sm_nl = "\n";CCtxMsgString::~CCtxMsgString(void){    return;}CNcbiOstream& CCtxMsgString::Write(CNcbiOstream& os) const{    return os << m_Message << sm_nl;}///////////////////////////////////////////////////////////////////////////////  CCgiContext:://CCgiContext::CCgiContext(CCgiApplication&        app,                         const CNcbiArguments*   args,                         const CNcbiEnvironment* env,                         CNcbiIstream*           inp,                         CNcbiOstream*           out,                         int                     ifd,                         int                     ofd,                         size_t                  errbuf_size,                         CCgiRequest::TFlags     flags)    : m_App(app),      m_Request(0),      m_Response(out, ofd){    try {        m_Request.reset(new CCgiRequest(args ? args : &app.GetArguments(),                                        env  ? env  : &app.GetEnvironment(),                                        inp, flags, ifd, errbuf_size));    }    catch (exception& _DEBUG_ARG(e)) {        _TRACE("CCgiContext::CCgiContext: " << e.what());        PutMsg("Bad request");        char buf[1];        CNcbiIstrstream dummy(buf, 0);        m_Request.reset(new CCgiRequest                        (args, env, &dummy, CCgiRequest::fIgnoreQueryString,                         ifd, errbuf_size));    }}CCgiContext::~CCgiContext(void){    return;}const CNcbiRegistry& CCgiContext::GetConfig(void) const{    return m_App.GetConfig();}CNcbiRegistry& CCgiContext::GetConfig(void){    return m_App.GetConfig();}const CNcbiResource& CCgiContext::GetResource(void) const{    return m_App.GetResource();}CNcbiResource& CCgiContext::GetResource(void){    return m_App.GetResource();}CCgiServerContext& CCgiContext::x_GetServerContext(void) const{    CCgiServerContext* context = m_ServerContext.get();    if ( !context ) {        context = m_App.LoadServerContext(const_cast<CCgiContext&>(*this));        if ( !context ) {            ERR_POST("CCgiContext::GetServerContext: no server context set");            throw runtime_error("no server context set");        }        const_cast<CCgiContext&>(*this).m_ServerContext.reset(context);    }    return *context;}const CCgiEntry& CCgiContext::GetRequestValue(const string& name,                                              bool*         is_found)    const{    pair<TCgiEntriesCI, TCgiEntriesCI> range =        GetRequest().GetEntries().equal_range(name);    if (range.second == range.first) {        if ( is_found ) {            *is_found = false;        }        static const CCgiEntry kEmptyCgiEntry(kEmptyStr);        return kEmptyCgiEntry;    }    if ( is_found ) {        *is_found = true;    }    const CCgiEntry& value = range.first->second;    while (++range.first != range.second) {        if (range.first->second != value) {            THROW1_TRACE(runtime_error,                         "duplicated entries in request with name: " +                         name + ": " + value.GetValue() + "!=" +                         range.first->second.GetValue());        }    }    return value;}void CCgiContext::RemoveRequestValues(const string& name){    GetRequest().GetEntries().erase(name);}void CCgiContext::AddRequestValue(const string& name, const CCgiEntry& value){    GetRequest().GetEntries().insert(TCgiEntries::value_type(name, value));}void CCgiContext::ReplaceRequestValue(const string&    name,                                      const CCgiEntry& value){    RemoveRequestValues(name);    AddRequestValue(name, value);}const string& CCgiContext::GetSelfURL(void) const{    if ( !m_SelfURL.empty() )        return m_SelfURL;    // Compose self URL    m_SelfURL = "http://";    m_SelfURL += GetRequest().GetProperty(eCgi_ServerName);    m_SelfURL += ':';    m_SelfURL += GetRequest().GetProperty(eCgi_ServerPort);    // (workaround a bug in the "www.ncbi" proxy -- replace adjacent '//')    m_SelfURL += NStr::Replace        (GetRequest().GetProperty(eCgi_ScriptName), "//", "/");    return m_SelfURL;}CCgiContext::TStreamStatusCCgiContext::GetStreamStatus(STimeout* timeout) const{#if defined(NCBI_OS_UNIX)  &&  !defined(NCBI_COMPILER_MW_MSL)    int ifd  = m_Request->GetInputFD();    int ofd  = m_Response.GetOutputFD();    int nfds = max(ifd, ofd) + 1;    if (nfds == 0) {        return 0;    }    fd_set readfds, writefds;    FD_ZERO(&readfds);    if (ifd >= 0) {        FD_SET(ifd, &readfds);    }    FD_ZERO(&writefds);    if (ofd >= 0) {        FD_SET(ofd, &writefds);    }    struct timeval tv;    tv.tv_sec  = timeout->sec;    tv.tv_usec = timeout->usec;    ::select(nfds, &readfds, &writefds, NULL, &tv);    TStreamStatus result = 0;    if (ifd >= 0  &&  FD_ISSET(ifd, &readfds)) {        result |= fInputReady;    }    if (ofd >= 0  &&  FD_ISSET(ofd, &writefds)) {        result |= fOutputReady;    }    return result;#else    return 0;#endif}END_NCBI_SCOPE/** ===========================================================================* $Log: cgictx.cpp,v $* Revision 1000.1  2004/06/01 18:39:10  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.37** Revision 1.37  2004/05/17 20:56:50  gorelenk* Added include of PCH ncbi_pch.hpp** Revision 1.36  2004/05/11 12:43:55  kuznets* Changes to control HTTP parsing (CCgiRequest flags)** Revision 1.35  2003/05/19 21:25:31  vakatov* In CCgiContext::ctor -- fixed invalid arg passage to CCgiRequest::ctor** Revision 1.34  2003/04/16 21:48:19  vakatov* Slightly improved logging format, and some minor coding style fixes.** Revision 1.33  2003/04/04 15:23:57  lavr* Slightly brushed; lines wrapped at 79th col** Revision 1.32  2003/04/03 14:14:59  rsmith* combine pp symbols NCBI_COMPILER_METROWERKS & _MSL_USING_MW_C_HEADERS* into NCBI_COMPILER_MW_MSL** Revision 1.31  2003/04/02 13:27:53  rsmith* GetStreamStatus not implemented on MacOSX w/Codewarrior using MSL headers.** Revision 1.30  2003/03/11 19:17:31  kuznets* Improved error diagnostics in CCgiRequest** Revision 1.29  2003/02/21 19:19:07  vakatov* CCgiContext::GetRequestValue() -- added optional arg "is_found"** Revision 1.28  2003/02/16 05:30:27  vakatov* GetRequestValue() to return "const CCgiEntry&" rather than just "CCgiEntry"* to avoid some nasty surprises for earlier user code looking as:*    const string& s = GetRequestValue(...);* caused by 'premature' destruction of temporary CCgiEntry object (GCC 3.0.4).** Revision 1.27  2002/07/10 18:40:44  ucko* Made CCgiEntry-based functions the only version; kept "Ex" names as* temporary synonyms, to go away in a few days.** Revision 1.26  2002/07/03 20:24:31  ucko* Extend to support learning uploaded files' names; move CVS logs to end.** Revision 1.25  2002/03/25 18:10:27  ucko* Include <unistd.h> on Unix; necessary for select on FreeBSD at least.** Revision 1.24  2002/02/21 17:04:56  ucko* [AIX] Include <strings.h> before <sys/time.h> for bzero.** Revision 1.23  2001/10/07 05:05:04  vakatov* [UNIX]  include <sys/time.h>** Revision 1.22  2001/10/04 18:17:53  ucko* Accept additional query parameters for more flexible diagnostics.* Support checking the readiness of CGI input and output streams.** Revision 1.21  2001/06/13 21:04:37  vakatov* Formal improvements and general beautifications of the CGI lib sources.** Revision 1.20  2000/12/23 23:54:01  vakatov* TLMsg container to use AutoPtr instead of regular pointer** Revision 1.19  2000/05/24 20:57:13  vasilche* Use new macro _DEBUG_ARG to avoid warning about unused argument.** Revision 1.18  2000/01/20 17:54:15  vakatov* CCgiContext:: constructor to get "CNcbiArguments*" instead of raw argc/argv.* All virtual member function implementations moved away from the header.** Revision 1.17  1999/12/23 17:16:18  golikov* CtxMsgs made not HTML lib depended** Revision 1.16  1999/12/15 19:19:10  golikov* fixes** Revision 1.15  1999/11/15 15:54:53  sandomir* Registry support moved from CCgiApplication to CNcbiApplication** Revision 1.14  1999/10/21 16:10:53  vasilche* Fixed memory leak in CNcbiOstrstream::str()** Revision 1.13  1999/10/01 14:21:40  golikov* Now messages in context are html nodes** Revision 1.12  1999/09/03 21:32:28  vakatov* Move #include <algorithm> after the NCBI #include's for more* consistency and to suppress some bulky MSVC++ warnings.** Revision 1.11  1999/07/15 19:05:17  sandomir* GetSelfURL(() added in Context** Revision 1.10  1999/07/07 14:23:37  pubmed* minor changes for VC++** Revision 1.9  1999/06/29 20:02:29  pubmed* many changes due to query interface changes** Revision 1.8  1999/05/14 19:21:54  pubmed* myncbi - initial version; minor changes in CgiContext, history, query** Revision 1.6  1999/05/06 20:33:43  pubmed* CNcbiResource -> CNcbiDbResource; utils from query; few more context methods** Revision 1.5  1999/05/04 16:14:44  vasilche* Fixed problems with program environment.* Added class CNcbiEnvironment for cached access to C environment.** Revision 1.4  1999/05/04 00:03:11  vakatov* Removed the redundant severity arg from macro ERR_POST()** Revision 1.3  1999/04/30 19:21:02  vakatov* Added more details and more control on the diagnostics* See #ERR_POST, EDiagPostFlag, and ***DiagPostFlag()** Revision 1.2  1999/04/28 16:54:41  vasilche* Implemented stream input processing for FastCGI applications.* Fixed POST request parsing** Revision 1.1  1999/04/27 14:50:04  vasilche* Added FastCGI interface.* CNcbiContext renamed to CCgiContext.* ===========================================================================*/

⌨️ 快捷键说明

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