|
| 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