On Thursday, 9 February 2012 at 08:26:25 UTC, Jacob Carlborg
wrote:
For example, ENV["REQUEST_URI"] returns differently on
different servers. Rails provides a method, "request_uri" on
the request object that will return the same value on all
different servers.
I don't know if CGI already has support for something similar.
Yeah, in cgi.d, you use Cgi.requestUri, which is an immutable
string, instead of using the environment variable directly.
requestUri = getenv("REQUEST_URI");
// Because IIS doesn't pass requestUri, we simulate it here if
it's empty.
if(requestUri.length == 0) {
// IIS sometimes includes the script name as part of the
path info - we don't want that
if(pathInfo.length >= scriptName.length && (pathInfo[0 ..
scriptName.length] == scriptName))
pathInfo = pathInfo[scriptName.length .. $];
requestUri = scriptName ~ pathInfo ~
(queryString.length ? ("?" ~ queryString) : "");
// FIXME: this works for apache and iis... but what
about others?
That's in the cgi constructor. Somewhat ugly code, but I figure
better to have ugly code in the library than incompatibilities
in the user program!
The http constructor creates these variables from the raw headers.
Here's the ddoc:
http://arsdnet.net/web.d/cgi.html
If you search for "requestHeaders", you'll see all the stuff
following. If you use those class members instead of direct
environment variables, you'll get max compatibility.