Mercurial > repos > rhope
annotate webserver.rhope @ 142:7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 21 Nov 2010 16:33:17 -0500 |
parents | 6202b866d72c |
children | 1f39e69446f9 |
rev | line source |
---|---|
0 | 1 |
2 Get Content Type[path:out] | |
3 { | |
4 parts <- [path]Split["."] | |
5 ext <- [parts]Index[ [[parts]Length] - [1] ] | |
6 If[ [ext] = ["html"] ] | |
7 { | |
8 out <- "text/html; charset=ISO-8859-1" | |
9 }{ | |
10 If[ [ext] = ["jpg"] ] | |
11 { | |
12 out <- "image/jpeg" | |
13 }{ | |
14 If[ [ext] = ["gif"] ] | |
15 { | |
16 out <- "image/gif" | |
17 }{ | |
18 If[ [ext] = ["css"] ] | |
19 { | |
20 out <- "text/css" | |
21 }{ | |
22 out <- "application/octet-stream" | |
23 } | |
24 } | |
25 } | |
26 } | |
27 } | |
28 | |
29 HTTP OK[client,type,content length,headers:out] | |
30 { | |
31 out <- HTTP Response[client, type, content length, headers, "200 OK"] | |
32 } | |
33 | |
34 HTTP Response[client,type,content length,headers,code:out] | |
35 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
36 start headers <- [Dictionary[]]Set["Content-Type", type] |
0 | 37 If[[content length] < [0]] |
38 { | |
39 default headers <- [start headers]Set["Transfer-Encoding", "Chunked"] | |
40 }{ | |
41 default headers <- [start headers]Set["Content-Length", content length] | |
42 } | |
43 | |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
44 out <- [client]Put String[ |
0 | 45 [ |
46 [ | |
47 [ | |
48 ["HTTP/1.1 "]Append[code] | |
49 ]Append["\r\n"] | |
50 ]Append[ | |
51 [ | |
52 Combine[headers, default headers] | |
53 ]Key Value Join[": ", "\r\n"] | |
54 ] | |
55 ]Append["\r\n\r\n"]] | |
56 } | |
57 | |
58 HTTP Not Found[client] | |
59 { | |
60 string <- "<html><head><title>Document Not Found</title></head><body>The document you requested is not available on this server.</body></html>" | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
61 HTTP Response[client, Get Content Type[".html"], [string]Length, Dictionary[], "404 Not Found"] |
0 | 62 { |
63 [~]Put String[string] | |
64 } | |
65 } | |
66 | |
67 Handle Request[client,type,query,headers,handler] | |
68 { | |
69 parts <- [query]Split["?"] | |
70 path <- [parts]Index[0] | |
71 [[path]Split["/"]]Index[1] | |
72 { | |
73 handlerpath <- ["/"]Append[~] | |
74 }{ | |
75 handlerpath <- "/" | |
76 } | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
77 host <- [headers]Index["Host"] {} |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
78 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
79 host <- "" |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
80 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
81 |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
82 the handler <- [handler]Index[[host]Append[handlerpath]] {} |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
83 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
84 the handler <- [handler]Index[handlerpath] {} |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
85 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
86 ,newpath <- [path]Slice[1] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
87 If[[newpath] = ["default.css"]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
88 { |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
89 file <- Open[File[newpath],"r"] |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
90 content length <- Length[file] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
91 If[[content length] > [0]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
92 { |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
93 data <- [file]Read[content length] |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
94 [HTTP OK[client, Get Content Type[path], content length, Dictionary[]] |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
95 ]Write[data] |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
96 { Close[file] } |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
97 }{ |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
98 HTTP Not Found[client] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
99 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
100 }{ |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
101 HTTP Not Found[client] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
102 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
103 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
104 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
105 |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
106 Val[the handler] |
0 | 107 { |
108 If[[[parts]Length] > [1]] | |
109 { | |
110 queryvars <- Dict Split[[parts]Index[1], "=", "&"] | |
111 }{ | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
112 queryvars <- Dictionary[] |
0 | 113 } |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
114 [~]Do@Worker[ [[[[[List[]]Append[client]]Append[path]]Append[type]]Append[queryvars]]Append[headers] ] |
0 | 115 } |
116 | |
117 } | |
118 | |
119 Connection Start[con,handlers] | |
120 { | |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
121 client, request <- [con]Get DString["\r\n"] |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
122 parts <- [request]Split[" "] |
0 | 123 Print[request] |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
124 [client]Get DString["\r\n\r\n"] |
0 | 125 { |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
47
diff
changeset
|
126 Handle Request[~, [parts]Index[0], [parts]Index[1], headers, handlers] |
0 | 127 }{ |
128 headers <- Map[Dict Split[~, ":", "\r\n"], ["Trim"]Set Input[1, " \t"]] | |
129 } | |
130 } | |
131 |