Skip to content

Commit

Permalink
Merge pull request #2945 from michaellilltokiwa/examples--fix-webserv…
Browse files Browse the repository at this point in the history
…er-example

examples: fix webserver example
  • Loading branch information
fridis committed Apr 22, 2024
2 parents 93b11b7 + 014ea8c commit 2291b67
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 46 deletions.
10 changes: 7 additions & 3 deletions examples/webserver/Makefile
Expand Up @@ -23,9 +23,13 @@
#
# -----------------------------------------------------------------------

all:
# we need to provide two additional options:
webserver/java:
# we need to provide an additional option:
#
# -modules=java.base to add Fuzion interface to java.base module
#
../../bin/fz -modules=java.base webserver
../../bin/fz -modules=java.base webserver_java.fz


webserver/native:
../../bin/fz webserver_native.fz
Expand Up @@ -28,15 +28,15 @@
#
# See Makefile for how to start fuzion to run this webserver.
#
webserver is
webserver_java is

# declare short hands to access Java net and io packages
net := Java.java.net
jio := Java.java.io

# open socket
port := 8080
serversocket := webserver.this.net.ServerSocket.new port
serversocket := webserver_java.this.net.ServerSocket.new port
match serversocket
err error => say "#### $err ####"
ss Java.java.net.ServerSocket =>
Expand Down
Expand Up @@ -26,53 +26,57 @@
#
# To start this webserver in the interpreter, use:
#
# fz webserver2.fz
# fz webserver_native.fz
#
# Alternatively, compile it using the C backend and run the resulting
# executable:
#
# fz -c webserver2.fz
# fz -c webserver_native.fz
# ./webserver
#
webserver2 is
webserver_native is

port u16 := 8080
server := net.server net.family.ipv6 net.protocol.tcp port
match net.server net.family.ipv6 net.protocol.tcp port
e error => say e
unit =>
say "started server on port: $port"
say "you may now send a request, e.g.:"
say "echo 'Hello' | curl 'http://[::1]:8080'"


# definition of a request handler
#
rh(n i32) : net.Request_Handler unit is

handle_request unit =>
say "accepted connection:"

match io.buffered.read_line
str String => say str
* =>

send200(data String) outcome unit =>
net.channel.env
.write """
HTTP/1.1 200 OK
Connection: close
Server: Fuzion demo WebServer v0.02
Content-Length: {data.byte_length}
Content-Type: text/html

for
ar := net.server.accept, net.server.accept
n in 1..
{data}
""".utf8

_ := send200 "<html>Hello Fuzion $n!</html>"

say "closed connection"


# accept connections while server is active
#
for n in 1..
while net.server.is_active
do
say "accepted connection: {ar}"

for
read := (net.channel net.server)
.read 1
.or (error "read error")
.bind String (d -> String.from_bytes d)
s := read.val, s + read.val
while read.ok && read.val != "\n"
else
say s

send200(data String) outcome unit =>
(net.channel net.server)
.write """
HTTP/1.1 200 OK
Connection: close
Server: Fuzion demo WebServer v0.02
Content-Length: {data.byte_length}
Content-Type: text/html

{data}
""".utf8
.or (error "write error")

_ := send200 "<html>Hello Fuzion $n!</html>"

_ := (net.channel net.server)
.close

say "closed connection"

unit
net.server.accept (rh n)


0 comments on commit 2291b67

Please sign in to comment.