diff options
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.v | 118 |
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) +} |