mirror of https://github.com/adamdruppe/arsd.git
all request headers should now be available
This commit is contained in:
parent
d6e0002779
commit
afa953838c
37
cgi.d
37
cgi.d
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue