From e5573750bd600b8ac88b54042a7793768ce58351 Mon Sep 17 00:00:00 2001 From: "Adam D. Ruppe" Date: Sun, 4 Dec 2011 23:25:27 -0500 Subject: [PATCH] i already forgot --- cgi.d | 34 +++++++++++++++++++++++++++++----- dom.d | 10 +++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/cgi.d b/cgi.d index 0daa0e5..66a1390 100644 --- a/cgi.d +++ b/cgi.d @@ -11,7 +11,6 @@ public import std.string; import std.uri; import std.exception; import std.base64; -//import std.algorithm; static import std.algorithm; public import std.stdio; import std.datetime; @@ -136,7 +135,7 @@ class Cgi { // this is an extension for when the method is not specified and you want to assume CommandLine } - /** Initializes it using the CGI interface */ + /** Initializes it using the CGI (or FastCGI) interface */ this(int maxContentLength = 5_000_000, // use this to override the environment variable listing in string[string] env = null, @@ -319,6 +318,18 @@ class Cgi { // fixme: remote_user script name } + /// Cleans up any temporary files. Do not use the object + /// after calling this. + /// + /// NOTE: it is called automatically by GenericMain + void dispose() { + foreach(file; files) { + if(!file.contentInMemory) + if(std.file.exists(file.contentFilename)) + std.file.remove(file.contentFilename); + } + } + private { struct PostParserState { string contentType; @@ -727,6 +738,8 @@ class Cgi { FIXME: data should be able to be streaming, for large files + indeed, it should probably just take a file descriptor + or two and do all the work itself. */ this(string[] headers, immutable(ubyte)[] data, string address, void delegate(const(ubyte)[]) _rawDataOutput = null, int pathInfoStarts = 0) { auto parts = headers[0].split(" "); @@ -917,7 +930,7 @@ class Cgi { */ bool contentInMemory = true; // the default ought to always be true immutable(ubyte)[] content; /// The actual content of the file, if contentInMemory == true - string contentFilename; /// the file where we dumped the content, if contentInMemory == false + string contentFilename; /// the file where we dumped the content, if contentInMemory == false. Note that if you want to keep it, you MUST move the file, since otherwise it is considered garbage when cgi is disposed. } /// Very simple method to require a basic auth username and password. @@ -1530,7 +1543,9 @@ version(embedded_httpd) void main() { version(embedded_httpd) { - serveHttp(&fun, 8080);//5005); + // what about forwarding the other constructor args? + // this probably needs a whole redoing... + serveHttp!CustomCgi(&fun, 8080);//5005); return; } @@ -1575,6 +1590,7 @@ version(embedded_httpd) try { fun(cgi); cgi.close(); + cgi.dispose(); } catch(Throwable t) { if(1) { // !cgi.isClosed) auto msg = t.toString; @@ -1597,6 +1613,7 @@ version(embedded_httpd) try { fun(cgi); cgi.close(); + cgi.dispose(); } catch (Throwable c) { // if the thing is closed, the app probably wrote an error message already, don't do it again. //if(cgi.isClosed) @@ -1610,7 +1627,8 @@ version(embedded_httpd) writefln("Status: 500 Internal Server Error\nContent-Type: text/html\n\n%s", "Internal Server Error



"~(std.array.replace(std.array.replace(message, "<", "<"), ">", ">"))~"
"); string str = c.toString(); - auto idx = str.indexOf("\n"); + // wtf it is bitching about a conflict with std.algorithm... out of the blue. + auto idx = std.string.indexOf(str, "\n"); if(idx != -1) str = str[0..idx]; @@ -1683,6 +1701,12 @@ void hackAroundLinkerError() { writeln(typeid(Cgi.UploadedFile[immutable(char)[]])); writeln(typeid(immutable(Cgi.UploadedFile)[immutable(char)[]])); writeln(typeid(immutable(char[])[immutable(char)[]])); + // this is getting kinda ridiculous btw. Moving assoc arrays + // to the library is the pain that keeps on coming. + + // eh this broke the build on the work server + // writeln(typeid(immutable(char)[][immutable(string[])])); + writeln(typeid(immutable(string[])[immutable(char)[]])); } diff --git a/dom.d b/dom.d index 59ad502..ccfc60a 100644 --- a/dom.d +++ b/dom.d @@ -607,14 +607,13 @@ class Element { Element addChild(string tagName, Html innerHtml) in { - assert(parentDocument !is null); } out(ret) { assert(ret !is null); assert(ret.parentNode is this); } body { - auto e = parentDocument.createElement(tagName); + auto e = Element.make(tagName); this.appendChild(e); e.innerHTML = innerHtml.source; return e; @@ -2443,9 +2442,10 @@ class Document : FileResource { } } - if(strict) - enforce(dataEncoding !is null, "I couldn't figure out the encoding of this document."); - else if(dataEncoding is null) { + if(dataEncoding is null) { + if(strict) + throw new MarkupError("I couldn't figure out the encoding of this document."); + else // if we really don't know by here, it means we already tried UTF-8, // looked for utf 16 and 32 byte order marks, and looked for xml or meta // tags... let's assume it's Windows-1252, since that's probably the most