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

📄 redirect.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: redirect.cpp,v $ * PRODUCTION Revision 1000.1  2004/06/01 19:15:48  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * PRODUCTION * =========================================================================== *//*  $Id: redirect.cpp,v 1000.1 2004/06/01 19:15:48 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: Vladimir Ivanov * * File Description: *    Class CCgiRedirectApplication - framework to redirec CGI requests. */#include <ncbi_pch.hpp>#include <misc/cgi_redirect/redirect.hpp>#include <cgi/cgictx.hpp>BEGIN_NCBI_SCOPE////////////////////////////////////////////////////////////////////////////////// CCgiRedirectApplication//// Default page templateconst char* const kDefaultRedirectTemplate = "\<html><head><title><@_TITLE_@></title></head>\n \<body>\n \    <center>\n \    <h1><@_HEADER_@></h1>\n \    <h3><@_MESSAGE_@></h3>\n \    <p>This web page has moved. Please, update your bookmarks and links.</p>\n \    <p><a href=\"<@_URL_@>\">Go to the new page</a></p>.\n \    </center> \</body> \</html>";void CCgiRedirectApplication::Init(void){    CParent::Init();    const CNcbiRegistry& reg = GetConfig();    // Set page title and messages    m_Page.AddTagMap("_TITLE_",  new CHTMLText(reg.Get("Main","PageTitle")));    m_Page.AddTagMap("_HEADER_", new CHTMLText(reg.Get("Main","Header")));    m_Page.AddTagMap("_MESSAGE_",new CHTMLText(reg.Get("Main","Message")));        // Wait time before redirect (if used by template)    m_Page.AddTagMap("_TIMER_",  new CHTMLText(reg.Get("Main", "Timer")));    // Set page template.    string template_name = reg.Get("Main", "Template");    if ( !template_name.empty() ) {        m_Page.SetTemplateFile(template_name);    } else {        m_Page.SetTemplateBuffer(kDefaultRedirectTemplate,                                 strlen(kDefaultRedirectTemplate));    }}bool s_FindEntryName(const string& name, list<string>& lst){    ITERATE(list<string>, i, lst) {        if (*i == name)            return true;    }    return false;}void s_AssignEntryValue(const string& name,                        const string& value,                        TCgiEntries&  old_entries,                        TCgiEntries&  new_entries){    SIZE_TYPE pos = 0;    string s(value);    while ( (pos = s.find("&{", pos)) != NPOS ) {        SIZE_TYPE pos_end = s.find("}", pos + 2);        if ( pos_end == NPOS ) {            break;        }        string name = value.substr(pos + 2, pos_end - pos - 2);        TCgiEntriesCI ci = old_entries.find(name);        if (ci != old_entries.end()) {            s.replace(pos, pos_end - pos + 1, URL_EncodeString((ci->second).GetValue()));        } else {            s.erase(pos, pos_end - pos + 1);        }        pos++;    }    s = URL_DecodeString(s);    CCgiEntry entry(s);    new_entries.insert(TCgiEntries::value_type(name, entry));}int CCgiRedirectApplication::ProcessRequest(CCgiContext& ctx){    const CNcbiRegistry& reg = ctx.GetConfig();    TCgiEntries new_entries;    // Remap CGI entries.    try {        RemapEntries(ctx, new_entries);    } catch (exception& e) {        ERR_POST("Failed to remap CGI entries: " << e.what());        return 1;    }    // Gnerate URLs    string base_url = reg.Get("Main", "BaseUrl");    m_Page.AddTagMap("_BASEURL_", new CHTMLText(base_url));    string url;    ITERATE(TCgiEntries, i, new_entries) {        if ( (i->first).empty() ) {            continue;         }        if ( !url.empty() ) {            url += '&';        }        url += i->first;        if ( !(i->second).empty() ) {            url += '=';            url += URL_EncodeString(i->second);        }        // Map each entry.        m_Page.AddTagMap(i->first, new CHTMLText(i->second));    }    m_Page.AddTagMap("_URL_", new CHTMLText(base_url + "?" + url));    // Compose and flush the resultant HTML page    try {        CCgiResponse& response = ctx.GetResponse();        response.WriteHeader();        m_Page.Print(response.out(), CNCBINode::eHTML);    } catch (exception& e) {        ERR_POST("Failed to compose/send HTML page: " << e.what());        return 1;    }    return 0;}TCgiEntries& CCgiRedirectApplication::RemapEntries(CCgiContext& ctx,                                                   TCgiEntries& new_entries){    const CCgiRequest& request = ctx.GetRequest();    TCgiEntries& entries = const_cast<TCgiEntries&>(request.GetEntries());    const CNcbiRegistry& reg = ctx.GetConfig();    // Substitute entries    // Get list of entries to remove    list<string> remove_entries;    string str = reg.Get("Entries", "Remove");    NStr::Split(str, " ", remove_entries);    // Get list of entries to clear    list<string> clear_entries;    str = reg.Get("Entries", "Clear");    NStr::Split(str, " ", clear_entries);    // Get list of entries to add as empty    list<string> add_empty_entries;    str = reg.Get("Entries", "Add");    NStr::Split(str, " ", add_empty_entries);    // Get substitutions for present entries    list<string> change_entries;    reg.EnumerateEntries("Change", &change_entries);    // Get list of new entries to add    list<string> add_value_entries;    reg.EnumerateEntries("Add", &add_value_entries);    // Create empty entry    CCgiEntry empty_entry(kEmptyStr);    ITERATE(TCgiEntries, i, entries) {        // Check entries marked to remove.        bool is_removed = false;        if ( s_FindEntryName(i->first, remove_entries)) {            is_removed = true;        }        // Replace entries marked to clear.        if ( s_FindEntryName(i->first, clear_entries) ) {            _TRACE("Add empty: " << i->first);            new_entries.insert(TCgiEntries::value_type(i->first, empty_entry));            continue;        }        // Change entry as specified in the [Change] section.        if ( s_FindEntryName(i->first, change_entries) ) {            _TRACE("Change: " << i->first);            str = reg.Get("Change", i->first);            s_AssignEntryValue(i->first, str, entries, new_entries);            continue;        }        // The entry was marked for deletion, do not add it.        if ( is_removed ) {            continue;        }        // Here we have entry, for which rules is not defined,        /// so just copy it as is.        new_entries.insert(*i);    }    // Add new empty entries.    ITERATE(list<string>, i, add_empty_entries) {        TCgiEntriesCI ci = entries.find(*i);        if (ci == entries.end()) {            new_entries.insert(TCgiEntries::value_type(*i, empty_entry));        }    }    // Add new values entries.    ITERATE(list<string>, i, add_value_entries) {        TCgiEntriesCI ci = entries.find(*i);        if (ci == entries.end()) {            str = reg.Get("Add", *i);            s_AssignEntryValue(*i, str, entries, new_entries);        }    }    return new_entries;}END_NCBI_SCOPE/* * =========================================================================== * $Log: redirect.cpp,v $ * Revision 1000.1  2004/06/01 19:15:48  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * * Revision 1.6  2004/05/17 21:01:48  gorelenk * Added include of PCH ncbi_pch.hpp * * Revision 1.5  2004/03/19 16:10:42  ivanov * ProcessRequest(): use ctx.GetConfig() * * Revision 1.4  2004/02/17 16:21:38  ivanov * Changed method of using another variables from "&var" to "&{var}". * Also, all new string values in the registry file must be specified * in the URL-encoded format. * * Revision 1.3  2004/02/10 15:25:37  ivanov * Enclosed mapped tag names with undescores to avoid conflicts default tags * with names of automaticaly mapped entries. * * Revision 1.2  2004/02/10 13:31:44  ivanov * Added missed \n in the default template * * Revision 1.1  2004/02/09 19:32:34  ivanov * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

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