all request headers should now be available

This commit is contained in:
Adam D. Ruppe 2011-12-03 20:09:02 -05:00
parent d6e0002779
commit afa953838c
1 changed files with 30 additions and 7 deletions

37
cgi.d
View File

@ -102,10 +102,10 @@ int locationOf(T)(T[] data, string item) {
/// the required constructors for you /// the required constructors for you
mixin template ForwardCgiConstructors() { mixin template ForwardCgiConstructors() {
this(int maxContentLength = 5_000_000, this(int maxContentLength = 5_000_000,
string delegate(string env) getenv = null, string[string] env = null,
const(ubyte)[] delegate() readdata = null, const(ubyte)[] delegate() readdata = null,
void delegate(const(ubyte)[]) _rawDataOutput = null void delegate(const(ubyte)[]) _rawDataOutput = null
) { super(maxContentLength, getenv, readdata, _rawDataOutput); } ) { super(maxContentLength, env, readdata, _rawDataOutput); }
this(string[] headers, immutable(ubyte)[] data, string address, void delegate(const(ubyte)[]) _rawDataOutput = null, int pathInfoStarts = 0) { this(string[] headers, immutable(ubyte)[] data, string address, void delegate(const(ubyte)[]) _rawDataOutput = null, int pathInfoStarts = 0) {
super(headers, data, address, _rawDataOutput, pathInfoStarts); super(headers, data, address, _rawDataOutput, pathInfoStarts);
@ -193,8 +193,8 @@ class Cgi {
/** Initializes it using the CGI interface */ /** Initializes it using the CGI interface */
this(int maxContentLength = 5_000_000, this(int maxContentLength = 5_000_000,
// use this to override the environment variable functions // use this to override the environment variable listing
string delegate(string env) getenv = null, in string[string] env = null,
// and this should return a chunk of data. return empty when done // and this should return a chunk of data. return empty when done
const(ubyte)[] delegate() readdata = null, const(ubyte)[] delegate() readdata = null,
// finally, use this to do custom output if needed // finally, use this to do custom output if needed
@ -202,8 +202,24 @@ class Cgi {
) )
{ {
rawDataOutput = _rawDataOutput; rawDataOutput = _rawDataOutput;
if(getenv is null) auto getenv = delegate string(string var) {
getenv = delegate string(string env) { return .getenv(env); }; if(env is null)
return .getenv(var);
auto e = var in env;
if(e is null)
return null;
return *e;
};
// fetching all the request headers
string[string] requestHeadersHere;
foreach(k, v; env is null ? cast(const) environment.toAA() : env) {
if(k.startsWith("HTTP_")) {
requestHeadersHere[replace(k["HTTP_".length .. $].toLower(), "_", "-")] = v;
}
}
this.requestHeaders = assumeUnique(requestHeadersHere);
requestUri = getenv("REQUEST_URI"); requestUri = getenv("REQUEST_URI");
cookie = getenv("HTTP_COOKIE"); cookie = getenv("HTTP_COOKIE");
@ -404,6 +420,8 @@ class Cgi {
string contentType = ""; string contentType = "";
string[string] requestHeadersHere;
foreach(header; headers[1..$]) { foreach(header; headers[1..$]) {
auto colon = header.indexOf(":"); auto colon = header.indexOf(":");
if(colon == -1) if(colon == -1)
@ -411,6 +429,8 @@ class Cgi {
string name = header[0..colon].toLower; string name = header[0..colon].toLower;
string value = header[colon+2..$]; // skip the colon and the space string value = header[colon+2..$]; // skip the colon and the space
requestHeadersHere[name] = value;
switch(name) { switch(name) {
case "accept": case "accept":
accept = value; accept = value;
@ -449,6 +469,8 @@ class Cgi {
} }
} }
requestHeaders = assumeUnique(requestHeadersHere);
// Need to set up get, post, and cookies // Need to set up get, post, and cookies
mixin(createVariableHashes()); mixin(createVariableHashes());
} }
@ -1024,6 +1046,7 @@ class Cgi {
For some of these, you'll want to refer to the http or cgi specs for more details. For some of these, you'll want to refer to the http or cgi specs for more details.
*/ */
immutable(string[string]) requestHeaders; /// All the raw headers in the request as name/value pairs. The name is stored as all lower case, but otherwise the same as it is in HTTP; words separated by dashes. For example, "cookie" or "accept-encoding". Many HTTP headers have specialized variables below for more convenience and static name checking; you should generally try to use them.
immutable(char[]) host; /// The hostname in the request. If one program serves multiple domains, you can use this to differentiate between them. immutable(char[]) host; /// The hostname in the request. If one program serves multiple domains, you can use this to differentiate between them.
immutable(char[]) userAgent; /// The browser's user-agent string. Can be used to identify the browser. immutable(char[]) userAgent; /// The browser's user-agent string. Can be used to identify the browser.
@ -1316,7 +1339,7 @@ version(embedded_httpd)
return ""; return "";
} }
auto cgi = new CustomCgi(5_000_000, &getFcgiEnvVar, &getFcgiChunk, &writeFcgi); auto cgi = new CustomCgi(5_000_000, fcgienv, &getFcgiChunk, &writeFcgi);
try { try {
fun(cgi); fun(cgi);
cgi.close(); cgi.close();