Mercurial > repos > rhope
annotate webserver.rhope @ 146:1f39e69446f9
Finished porting webserver
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 21 Nov 2010 22:47:14 -0500 |
parents | 7bbdc034e347 |
children | f3686f60985d |
rev | line source |
---|---|
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
1 |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
2 Import net.rhope |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
3 |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
4 _Dict Split[dict,entry,index,keydelim:out] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
5 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
6 parts <- [entry]Split[keydelim] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
7 out <- [dict]Set[[parts]Index[0],[parts]Index[1]] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
8 } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
9 |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
10 Dict Split[string,keydelim,entrydelim:out] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
11 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
12 out <- Fold[_Dict Split[?, ?, ?, keydelim], Dictionary[], [string]Split[entrydelim]] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
13 } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
14 |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
15 _Key Value Join[dict,key,key sep,val sep,string:out] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
16 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
17 new string <- [[[string]Append[String[key]]]Append[key sep]]Append[ String[[dict]Index[key]] ] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
18 [dict]Next[key] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
19 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
20 out <- _Key Value Join[dict, ~, key sep, val sep, [new string]Append[val sep]] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
21 }{ |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
22 out <- Val[new string] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
23 } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
24 } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
25 |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
26 Key Value Join[dict,key sep,val sep:out] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
27 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
28 [dict]First |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
29 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
30 out <- _Key Value Join[dict, ~, key sep, val sep, ""] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
31 }{ |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
32 out <- "" |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
33 } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
34 } |
0 | 35 |
36 Get Content Type[path:out] | |
37 { | |
38 parts <- [path]Split["."] | |
39 ext <- [parts]Index[ [[parts]Length] - [1] ] | |
40 If[ [ext] = ["html"] ] | |
41 { | |
42 out <- "text/html; charset=ISO-8859-1" | |
43 }{ | |
44 If[ [ext] = ["jpg"] ] | |
45 { | |
46 out <- "image/jpeg" | |
47 }{ | |
48 If[ [ext] = ["gif"] ] | |
49 { | |
50 out <- "image/gif" | |
51 }{ | |
52 If[ [ext] = ["css"] ] | |
53 { | |
54 out <- "text/css" | |
55 }{ | |
56 out <- "application/octet-stream" | |
57 } | |
58 } | |
59 } | |
60 } | |
61 } | |
62 | |
63 HTTP OK[client,type,content length,headers:out] | |
64 { | |
65 out <- HTTP Response[client, type, content length, headers, "200 OK"] | |
66 } | |
67 | |
68 HTTP Response[client,type,content length,headers,code:out] | |
69 { | |
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
|
70 start headers <- [Dictionary[]]Set["Content-Type", type] |
0 | 71 If[[content length] < [0]] |
72 { | |
73 default headers <- [start headers]Set["Transfer-Encoding", "Chunked"] | |
74 }{ | |
75 default headers <- [start headers]Set["Content-Length", content length] | |
76 } | |
77 | |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
78 out <- [ |
0 | 79 [ |
80 [ | |
81 [ | |
82 ["HTTP/1.1 "]Append[code] | |
83 ]Append["\r\n"] | |
84 ]Append[ | |
85 [ | |
86 Combine[headers, default headers] | |
87 ]Key Value Join[": ", "\r\n"] | |
88 ] | |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
89 ]Append["\r\n\r\n"] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
90 ]Write to File[client] |
0 | 91 } |
92 | |
93 HTTP Not Found[client] | |
94 { | |
95 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
|
96 HTTP Response[client, Get Content Type[".html"], [string]Length, Dictionary[], "404 Not Found"] |
0 | 97 { |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
98 [string]Write to File[~] |
0 | 99 } |
100 } | |
101 | |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
102 Good Path?[path:yep,nope] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
103 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
104 nope <- If[[path]Starts With["."]] {} |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
105 { nope <- If[[path]Starts With["/"]] {} |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
106 { nope <- If[[path]Contains[".."]] {} |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
107 { nope,yep <- If[[path]Contains["//"]] }}} |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
108 } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
109 |
0 | 110 Handle Request[client,type,query,headers,handler] |
111 { | |
112 parts <- [query]Split["?"] | |
113 path <- [parts]Index[0] | |
114 [[path]Split["/"]]Index[1] | |
115 { | |
116 handlerpath <- ["/"]Append[~] | |
117 }{ | |
118 handlerpath <- "/" | |
119 } | |
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
|
120 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
|
121 { |
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
|
122 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
|
123 } |
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
|
124 |
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
|
125 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
|
126 { |
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
|
127 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
|
128 { |
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
|
129 ,newpath <- [path]Slice[1] |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
130 Good Path?[newpath] |
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
|
131 { |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
132 file <- Open[File[newpath],"r"] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
133 content length <- Length[file] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
134 If[[content length] > [0]] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
135 { |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
136 data <- [file]Read[content length] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
137 [HTTP OK[client, Get Content Type[path], content length, Dictionary[]] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
138 ]Write[data] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
139 { Close[file] } |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
140 }{ |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
141 HTTP Not Found[client] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
142 } |
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
|
143 }{ |
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
|
144 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
|
145 } |
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
|
146 } |
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
|
147 } |
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
|
148 |
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
|
149 Val[the handler] |
0 | 150 { |
151 If[[[parts]Length] > [1]] | |
152 { | |
153 queryvars <- Dict Split[[parts]Index[1], "=", "&"] | |
154 }{ | |
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
|
155 queryvars <- Dictionary[] |
0 | 156 } |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
157 [~]Call[client,path,type,queryvars,headers] |
0 | 158 } |
159 | |
160 } | |
161 | |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
162 Connection Start[con,address,handlers] |
0 | 163 { |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
164 ,client <- [con]Read Delim[["\r\n"]Buffer >>] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
165 { request <- String[~] } |
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
|
166 parts <- [request]Split[" "] |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
167 Print[[[request]Append[" "]]Append[address]] |
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
168 [client]Read Delim[["\r\n\r\n"]Buffer >>] |
0 | 169 { |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
170 headers <- Map[Dict Split[String[~], ":", "\r\n"], Trim[?, " \t"]] |
0 | 171 }{ |
146
1f39e69446f9
Finished porting webserver
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
172 Handle Request[~, [parts]Index[0], [parts]Index[1], headers, handlers] |
0 | 173 } |
174 } | |
175 |