Mercurial > repos > rhope
diff webserver.vistxt @ 0:76568becd6d6
Rhope Alpha 2a source import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Apr 2009 23:06:07 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webserver.vistxt Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,116 @@ +Import extendlib.vistxt + +Get Content Type(1,1) +|: + parts <- [path(0)]Split["."] + ext <- [parts]Index[ [[parts]Length] - [1] ] + If[ [ext] = ["html"] ] + |: + out(0) <- "text/html; charset=ISO-8859-1" + :||: + If[ [ext] = ["jpg"] ] + |: + out(0) <- "image/jpeg" + :||: + If[ [ext] = ["gif"] ] + |: + out(0) <- "image/gif" + :||: + If[ [ext] = ["css"] ] + |: + out(0) <- "text/css" + :||: + out(0) <- "application/octet-stream" + :| + :| + :| + :| +:| + +HTTP OK(4,1) +|: + out(0) <- HTTP Response[client(0), type(1), content length(2), headers(3), "200 OK"] +:| + +HTTP Response(5,1) +|: + start headers <- [New@Dictionary[]]Set["Content-Type", type(1)] + If[[content length(2)] < [0]] + |: + default headers <- [start headers]Set["Transfer-Encoding", "Chunked"] + :||: + default headers <- [start headers]Set["Content-Length", content length(2)] + :| + + out(0) <- [client(0)]Put String@Net Client[ + [ + [ + [ + ["HTTP/1.1 "]Append[code(4)] + ]Append["\r\n"] + ]Append[ + [ + Combine[headers(3), default headers] + ]Key Value Join[": ", "\r\n"] + ] + ]Append["\r\n\r\n"]] +:| + +HTTP Not Found(1,0) +|: + string <- "<html><head><title>Document Not Found</title></head><body>The document you requested is not available on this server.</body></html>" + HTTP Response[client(0), Get Content Type[".html"], [string]Length, New@Dictionary[], "404 Not Found"] + |: + [~]Put String[string] + :| +:| + +Handle Request(5,0) +|: + parts <- [query(2)]Split["?"] + path <- [parts]Index[0] + [[path]Split["/"]]Index[1] + |: + handlerpath <- ["/"]Append[~] + :||: + handlerpath <- "/" + :| + [handler(4)]Index[handlerpath] + |: + If[[[parts]Length] > [1]] + |: + queryvars <- Dict Split[[parts]Index[1], "=", "&"] + :||: + queryvars <- New@Dictionary[] + :| + [~]Do@Worker[ [[[[[New@List[]]Append[client(0)]]Append[path]]Append[type(1)]]Append[queryvars]]Append[headers(3)] ] + :||: + + ,newpath <- [path]Slice@String[1] + file <- <String@File[newpath] + content length <- Length[file] + If[[content length] > [0]] + |: + junk,data <- [file]Get FString[content length] + [HTTP OK[client(0), Get Content Type[path], content length, New@Dictionary[]] + ]Put String@Net Client[data] + :||: + HTTP Not Found[client(0)] + :| + :| + +:| + +Connection Start(2,0) +|: + client, request <- [con(0)]Get DString@Net Client["\r\n"] + parts <- [request]Split@String[" "] + Print[request] + [client]Get DString@Net Client["\r\n\r\n"] + |: + Handle Request[~, [parts]Index@List[0], [parts]Index@List[1], headers, handlers(1)] + :||: + headers <- Map[Dict Split[~, ":", "\r\n"], ["Trim"]Set Input[1, " \t"]] + :| +:| +