Project

General

Profile

Feature #3404

docRoot per URL

Added by Jeff Flesher about 8 years ago. Updated about 8 years ago.

Status:
New
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
06/30/2014
Due date:
% Done:

0%

Estimated time:

Description

Currently docRoot is defined at run time via ---docRoot, but for Applications with Multiple URL that want to access a different docRoot based on the URL, this approach does not work.

Running an Application per URL also does not work on my VPS, I run out of PostgreSQL connections too fast, also this is just not a very efficient approach, in my Opinion this fix is easy to make without causing any backwards compatibility issues, and does not take much time to execute, so its well worth the Feature.

Modifying WApplication.C docRoot as Below code blocked worked to fix the problem with docRoot, but would need to be fixed in Configuration.C, or what ever code sets appDoc.

The idea is simple, in wt_config.xml, set a property for a custom docRoot as such:

    <property name="customDocRoot-localhost">/path/doc_root/</property> 
    <property name="customDocRoot-domain.tdl">/path/doc_root/</property>

If the name does not exist, it will return the value the old way.

std::string WApplication::docRoot() const
{
    // define Custom docRoot
    std::string myCDR;
    // Get host Name
    WApplication *app = WApplication::instance();
    std::string domainName = app->environment().hostName().c_str();
    // Remove Port number if it exist
    unsigned pos = domainName.find(":");
    if (pos > 0)
      domainName = domainName.substr(0, pos);
    // Now do a look up in wt_config: <property name="customDocRoot-domain.tdl">/path/doc_root/</property>
    if (!readConfigurationProperty("customDocRoot-" + domainName, myCDR))
       Wt::log("warning") << "WApplication::docRoot() readConfigurationProperty not found in wt_config.xml for: customDocRoot-" << domainName << ". Add <property name=\"customDocRoot-" << domainName << "\">/path/doc_root</property>";
    if (myCDR.empty())
      return environment().getCgiValue("DOCUMENT_ROOT");
    else
      return myCDR.c_str();
}

You could do the same thing for appRoot, that way it would not have to be hard coded.

Jeff Flesher

Thanks

Also available in: Atom PDF