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