aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/vweb/tests/vweb_test_server.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/vweb/tests/vweb_test_server.v')
-rw-r--r--v_windows/v/vlib/vweb/tests/vweb_test_server.v118
1 files changed, 118 insertions, 0 deletions
diff --git a/v_windows/v/vlib/vweb/tests/vweb_test_server.v b/v_windows/v/vlib/vweb/tests/vweb_test_server.v
new file mode 100644
index 0000000..4dfeb7d
--- /dev/null
+++ b/v_windows/v/vlib/vweb/tests/vweb_test_server.v
@@ -0,0 +1,118 @@
+module main
+
+import os
+import vweb
+import time
+
+const (
+ known_users = ['bilbo', 'kent']
+)
+
+struct App {
+ vweb.Context
+ port int
+ timeout int
+ global_config shared Config
+}
+
+struct Config {
+ max_ping int
+}
+
+fn exit_after_timeout(timeout_in_ms int) {
+ time.sleep(timeout_in_ms * time.millisecond)
+ // eprintln('webserver is exiting ...')
+ exit(0)
+}
+
+fn main() {
+ if os.args.len != 3 {
+ panic('Usage: `vweb_test_server.exe PORT TIMEOUT_IN_MILLISECONDS`')
+ }
+ http_port := os.args[1].int()
+ assert http_port > 0
+ timeout := os.args[2].int()
+ assert timeout > 0
+ go exit_after_timeout(timeout)
+ //
+ shared config := &Config{
+ max_ping: 50
+ }
+ app := &App{
+ port: http_port
+ timeout: timeout
+ global_config: config
+ }
+ eprintln('>> webserver: started on http://127.0.0.1:$app.port/ , with maximum runtime of $app.timeout milliseconds.')
+ // vweb.run<App>(mut app, http_port)
+ vweb.run(app, http_port)
+}
+
+// pub fn (mut app App) init_server() {
+//}
+
+pub fn (mut app App) index() vweb.Result {
+ assert app.global_config.max_ping == 50
+ return app.text('Welcome to VWeb')
+}
+
+pub fn (mut app App) simple() vweb.Result {
+ return app.text('A simple result')
+}
+
+pub fn (mut app App) html_page() vweb.Result {
+ return app.html('<h1>ok</h1>')
+}
+
+// the following serve custom routes
+['/:user/settings']
+pub fn (mut app App) settings(username string) vweb.Result {
+ if username !in known_users {
+ return app.not_found()
+ }
+ return app.html('username: $username')
+}
+
+['/:user/:repo/settings']
+pub fn (mut app App) user_repo_settings(username string, repository string) vweb.Result {
+ if username !in known_users {
+ return app.not_found()
+ }
+ return app.html('username: $username | repository: $repository')
+}
+
+['/json_echo'; post]
+pub fn (mut app App) json_echo() vweb.Result {
+ // eprintln('>>>>> received http request at /json_echo is: $app.req')
+ app.set_content_type(app.req.header.get(.content_type) or { '' })
+ return app.ok(app.req.data)
+}
+
+['/form_echo'; post]
+pub fn (mut app App) form_echo() vweb.Result {
+ app.set_content_type(app.req.header.get(.content_type) or { '' })
+ return app.ok(app.form['foo'])
+}
+
+// Make sure [post] works without the path
+[post]
+pub fn (mut app App) json() vweb.Result {
+ // eprintln('>>>>> received http request at /json is: $app.req')
+ app.set_content_type(app.req.header.get(.content_type) or { '' })
+ return app.ok(app.req.data)
+}
+
+pub fn (mut app App) shutdown() vweb.Result {
+ session_key := app.get_cookie('skey') or { return app.not_found() }
+ if session_key != 'superman' {
+ return app.not_found()
+ }
+ go app.gracefull_exit()
+ return app.ok('good bye')
+}
+
+fn (mut app App) gracefull_exit() {
+ eprintln('>> webserver: gracefull_exit')
+ time.sleep(100 * time.millisecond)
+ exit(0)
+}