Skip to content

Commit 12fe3fc

Browse files
authored
Port 'HTTP Server' demo to Vala (#173)
1 parent 6a74083 commit 12fe3fc

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

src/HTTP Server/main.vala

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg libsoup-3.0
2+
private Gtk.Label label_greetings;
3+
private Gtk.ToggleButton button_server;
4+
private Gtk.LinkButton linkbutton;
5+
int port;
6+
7+
void handler (Soup.Server server, Soup.ServerMessage msg, string path, HashTable<string, string>? query) {
8+
var content_type_params = new HashTable<string, string> (str_hash, str_equal);
9+
content_type_params["charset"] = "UTF-8";
10+
11+
msg.set_status (Soup.Status.OK, null);
12+
msg.get_response_headers ().set_content_type ("text/html", content_type_params);
13+
msg.get_response_body ().append_take ("""
14+
<html>
15+
<body>
16+
<form action="/hello">
17+
<label for="name">What is your name?</label>
18+
<input type="text" name="name">
19+
<input type="submit" value="Submit">
20+
</form>
21+
</body>
22+
</html>
23+
""".data);
24+
}
25+
26+
void hello_handler (Soup.Server server, Soup.ServerMessage msg, string path, HashTable<string, string>? query) {
27+
if (query == null) {
28+
msg.set_redirect (Soup.Status.FOUND, "/");
29+
return;
30+
}
31+
32+
string user_agent = msg.get_request_headers ().get_one ("User-Agent");
33+
string name = query["name"];
34+
label_greetings.label = (@"Hello $(name), your browser is\n$(user_agent)");
35+
var content_type_params = new HashTable<string, string> (str_hash, str_equal);
36+
content_type_params["charset"] = "UTF-8";
37+
msg.set_status (Soup.Status.OK, null);
38+
msg.get_response_headers ().set_content_type ("text/html", content_type_params);
39+
msg.get_response_body ().append_take ("
40+
<html>
41+
<body>
42+
Thank you, please go back to Workbench.
43+
</body>
44+
</html>
45+
".data);
46+
}
47+
48+
void start_server (Soup.Server server) {
49+
try {
50+
server.listen_local (port, 0);
51+
SList<Uri> uri = server.get_uris ();
52+
port = uri.data.get_port ();
53+
linkbutton.uri = (@"http://localhost:$(port)");
54+
55+
button_server.label = "Stop Server";
56+
} catch (Error e) {
57+
warning (@"$(e.message)");
58+
}
59+
}
60+
61+
void stop_server (Soup.Server server) {
62+
server.disconnect ();
63+
linkbutton.uri = "";
64+
button_server.label = "Start Server";
65+
}
66+
67+
public void main () {
68+
69+
button_server = (Gtk.ToggleButton) workbench.builder.get_object ("button_server");
70+
linkbutton = (Gtk.LinkButton) workbench.builder.get_object ("linkbutton");
71+
label_greetings = (Gtk.Label) workbench.builder.get_object ("label_greetings");
72+
73+
var server = new Soup.Server ("");
74+
75+
server.add_handler ("/", handler);
76+
server.add_handler ("/hello", hello_handler);
77+
78+
button_server.clicked.connect (() => {
79+
if (button_server.active) {
80+
start_server (server);
81+
} else {
82+
stop_server (server);
83+
}
84+
});
85+
}

0 commit comments

Comments
 (0)