gserver, in Go

gserver is an experimental web server adapted to serve OGDL templates along with static content. It is not optimized and not well tested, as of now.


- The file extension of (some) files below the document root is optional - Trailing slash and index files detection - Markdown rendering on the fly. - Login, Logout example functionality - Upload files go to /_user/file/$user/$folder/ - Template functionality extensible through Go plugins

Parameter substitution in paths

While resolving a path in the document root, entries of the form _token are used for path elements not directly found in the file system. In that case 'token' will be available later as a variable, set to the unknown path element.

For example:


will be sent to


if that path is present. Two variables will be available in the context:

user=john id=1


There are two routes configured in gserver:

/:user/file/*filepath /*filepath

The first one goes to a static file handler that translates that path to /_user/file/:user/*filepath. This handler doesn't create or need sessions.

The second goes to a handler that uses the parameter substitution mechanism explained above, creates sessions, processes file uploads and templates.

Any path that has not the form /token/file/* goes to this second route.

The static handler will not return paths with elements that start with a dot. The dynamic handler, in addition, will ignore path with elements starting with an underscore, since these are reserved for variables.

File upload

Any POST request with files attached (multipart) and a field named "UploadFiles" that is handled by the second handler will store those files in /_user/file/$user/$folder/. $user is the current authenticated user and $folder is 'default' or the content of a field named 'folder' in the request.

Without an authenticated user no files will be stored in the server.

TODO: public and private files (ACL, casbin?)



Remote functions

OGDL remote functions (RPC endpoints) can be configured in .conf/config:

ogdlrf git host localhost:1135 zoekt host localhost:1166

TODO: document in ogdl-go how to create servers and clients.


Plugins that are present in .conf/plugin are loaded in made available in the request context. Public methods in those plugins can then be accessed in templates. If a plugin is present, a Database object is expected which will be placed in the context so that $database.Method() can be called in the template.

Markdown processor ($MD())

TODO: describe the extensions and the \escape inline syntax for processing style and function calls.

Form to context

Form inputs are stored in the request's context and made directly accessible in templates. Input names are taken as simple paths (tokens separated by dots), and the special case where the name ends with ._ogdl is parsed as OGDL before stored in the context.

For example, the content of the following form:

could be something like this:

obj name "Pepe Delgado" conf ip net

Login, Logout

There is no specific path for login or logout. Any request which does not go to the static file handler will recognize the parameters 'Login' and 'Logout' if present. The default login handler accepts any non-empty username and any password.

The 'redirect' parameter can be used to send the user to a specific page after login. The default behavior is to return to the same page.

MD5 signature: cec5ee688213af20c4a8f365459c40d9