use Windows, Math, Strings, Editor, System
use HTTPTypes
design BrowserTest is
cell Window
constructor is
Window = create MenuWindow("Interfacing with the browser")
system <- stdout.Set(Window)
create ServerDesign("27524")
end
end
design ServerDesign(ansi Port) is
cell ConxMgr
keep Port
cell Client
constructor is
system <- Service.Get("ConxMgr")
end
destructor is
ConxMgr <- HTTP.Stop.Listening(Port)
end
on Service.Provider(ansi Service, cell Provider) do
Service is "ConxMgr" ? ConxMgr = Provider : yield
ConxMgr <- TCPIP.Listen(Port)
system <- println("Waiting for clients...")
end
on TCPIP.Accept(ConxClass Conx) do
ConxMgr <- Set.Protocol( Conx, "HTTP", self )
system <- println("Server [self]: Connection request [Conx] accepted")
end
on HTTP.Ready( cell Client ) do
keep Client
system <- println("Protocol is ready")
end
interface HTTP is
on GET(ansi URI, ansi Version, Header[] Headers, byte[] Content) do
ansi MyMessage
Header ResponseHeaders[]
byte[] StyleSheet, HomePage
int Error
system <- println("Server [self]: Client [sender] GET request URI=[URI] Version=[Version]")
for each Header in Headers do
system <- println("Header [Header.Name]: [Header.Value]")
end
switch URI
case "/sayhello":
MyMessage = "\-<html>
<head><title>CellSpeak Server Test</title></head>
<body bgcolor=\"lightblue\">
<center><h1>Hello Browser</h1>
<p>This is a simple example of how to interact with the browser. </p>
<p>Because CellSpeak is a message based language, it is easy to make a server.</p>
</center>
</body>
</html>"
ResponseHeaders = [ [ "Date", HTTPDate()],
[ "Content-Type", "text/html" ],
[ "Connection", "keep-alive"],
[ "Content-Length", "[MyMessage.len()]" ] ]
sender <- HTTP.RESPONSE("HTTP/1.1", "200", "OK", ResponseHeaders, MyMessage)
case "/green" :
MyMessage = "\-<html>
<head><title>CellSpeak Server Test</title></head>
<body bgcolor=\"lightgreen\">
<center><h1>Another page</h1></center>
<hr><center>This page is green.</center>
</body>
</html>"
ResponseHeaders = [ [ "Date", HTTPDate()],
[ "Content-Type", "text/html" ],
[ "Content-Length", "[MyMessage.len()]" ] ]
sender <- HTTP.RESPONSE("HTTP/1.1", "200", "OK", ResponseHeaders, MyMessage)
case "/cellspeak" :
Error, HomePage = File.Read("CellSpeak.html")
Error ? system <- println("Error reading file [Error]") & yield
ResponseHeaders = [ [ "Date", HTTPDate()],
[ "Content-Type", "text/html" ],
[ "Content-Length", "[nel HomePage]" ] ]
sender <- HTTP.RESPONSE("HTTP/1.1", "200", "OK", ResponseHeaders, HomePage)
case "/CellSpeak.css" :
Error, StyleSheet = File.Read("CellSpeak.css")
Error ? system <- println("Error reading file [Error]") & yield
ResponseHeaders = [ [ "Date", HTTPDate()],
[ "Content-Type", "text/css" ],
[ "Content-Length", "[nel StyleSheet]" ] ]
sender <- HTTP.RESPONSE("HTTP/1.1", "200", "OK", ResponseHeaders, StyleSheet)
default :
MyMessage = "\-<html>
<head><title>CellSpeak Server Test</title></head>
<body bgcolor=\"red\">
<center><h1>The dreaded 404 page</h1></center>
<hr><center>We're sorry, we could not find what you are looking for.</center>
</body>
</html>"
ResponseHeaders = [ [ "Date", HTTPDate()],
[ "Content-Type", "text/html" ],
[ "Content-Length", "[MyMessage.len()]" ] ]
sender <- HTTP.RESPONSE("HTTP/1.1", "404", "Not Found", ResponseHeaders, MyMessage)
end
end
interface end
end