(notonline)-->
-- demo\rosetta\SimpleHttpServer.exw
without js
include builtins\sockets.e
constant MAX_QUEUE = 100,
ESCAPE = #1B,
response = substitute("""
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<title>Bye-bye baby bye-bye</title>
<style>
body { background-color: #111 }
h1 { font-size:4cm; text-align: center; color: black;
text-shadow: 0 0 2mm red}
</style>
</head>
<body>
<h1>Goodbye, world!</h1>
</body>
</html>
""","\n","\r\n")
puts(1,"server started, open http://localhost:8080/ in browser or curl, press Esc or Q to quit\n")
atom sock = socket(AF_INET,SOCK_STREAM,NULL),
pSockAddr = sockaddr_in(AF_INET, "", 8080)
if bind(sock, pSockAddr)=SOCKET_ERROR then crash("bind (%v)",{get_socket_error()}) end if
if listen(sock,MAX_QUEUE)=SOCKET_ERROR then crash("listen (%v)",{get_socket_error()}) end if
while not find(get_key(),{ESCAPE,'q','Q'}) do
{integer code} = select({sock},{},{},250000) -- (0.25s)
if code=SOCKET_ERROR then crash("select (%v)",{get_socket_error()}) end if
if code>0 then -- (not timeout)
atom peer = accept(sock),
ip = getsockaddr(peer)
{integer len, string request} = recv(peer)
printf(1,"Client IP: %s\n%s\n",{ip_to_string(ip),request})
if length(request)>3 and request[1..4]="GET " then
integer bytes_sent = send(peer,response)
printf(1,"%d bytes successfully sent\n",bytes_sent)
end if
shutdown(peer, SD_SEND) -- tell curl it's over
peer = closesocket(peer) -- (as does this)
end if
end while
sock = closesocket(sock)
WSACleanup()