HTTP Server
Last updated
Was this helpful?
Last updated
Was this helpful?
The HTTP server serves as the entry point for Diarkis. The application server connects to the HTTP server to obtain real-time connection endpoints and encryption keys.
Additionally, you can define custom endpoints.
To expose built-in commands to the client, you can set it up using the diarkisexec
package.
You can expose built-in commands by specifying modules with diarkisexec.SetupDiarkis()
. By setting ConfigPath
for each module, you can customize the configuration.
You can expose custom commands using diarkisexec.SetServerCommandHandler()
.
You can set up a UDP server with diarkisexec.SetupDiarkisHTTPServer()
. You can customize the server settings using a JSON file as an argument.
The above functions must be executed before calling
diarkisexec.StartDiarkis()
.
For more details, please refer to the API reference of diarkisexec.
package main
import (
"github.com/Diarkis/diarkis/diarkisexec"
"github.com/Diarkis/diarkis-server-template/cmds"
)
func main() {
logConfigPath := "/configs/shared/log.json"
meshConfigPath := "/configs/shared/mesh.json"
diarkisexec.SetupDiarkis(logConfigPath, meshConfigPath, &diarkisexec.Modules{
Dive: &diarkisexec.Options{ConfigPath: "/configs/shared/dive.json", ExposeCommands: true},
Field: &diarkisexec.Options{ConfigPath: "/configs/shared/field.json", ExposeCommands: true},
DM: &diarkisexec.Options{ConfigPath: "/configs/shared/dm.json", ExposeCommands: true},
MatchMaker: &diarkisexec.Options{ConfigPath: "/configs/shared/matching.json", ExposeCommands: true},
})
httpcmds.SetupHTTP()
diarkisexec.SetupDiarkisHTTPServer("/configs/http/main.json")
diarkisexec.StartDiarkis()
}
Specify the path to the JSON file in meshConfigPath
. For more details, refer to HTTP Server.
Configuration is done in JSON format.
address
"127.0.0.1"
The address for binding the UDP server
port
"7000"
The port for the UDP server to bind to. The UDP server will automatically search for an available port starting from the specified port.
useFixedPort
false
If set to true, the HTTP server will bind only to the specified port.
timeout
5
HTTP response timeout (seconds)
enableEncryption
true
If set to false, packet encryption and decryption will be disabled. Other servers need to be configured similarly.
For more details, please refer to the API reference for http.
Diarkis's HTTP server allows you to write custom endpoints.
package httpcmds
import (
"github.com/Diarkis/diarkis/server/http"
)
func Expose(rootpath string) {
// :message is treated as a parameter and the value can be accessed from *http.Params
http.Get("/hello/:message", handleHello)
}
func handleHello(res *http.Response, req *http.Request, params *http.Params, next func(error)) {
message := params.GetAsString("message")
res.Respond(message, http.Ok)
// move on to other handlers
next(nil)
}
Diarkis's HTTP server automatically decodes the request body into req.JSONBody
when the ContentType of the request is application/json
. Note that an object must be described to store in the JSON Body.
package httpcmds
import (
"github.com/Diarkis/diarkis/server/http"
)
func Expose(rootpath string) {
http.Post("/echo", handleEcho)
}
func handleEcho(res *http.Response, req *http.Request, params *http.Params, next func(error)) {
if req.JSONBody == nil {
err := errors.New("expect JSON body")
res.Respond(err.Error(), http.Bad)
next(err)
return
}
message, ok := req.JSONBody["message"].(string)
if !ok {
err := errors.New("missing parameter message")
res.Respond(err.Error(), http.Bad)
next(err)
return
}
enc, err := json.Marshal(map[string]any{"echo": message})
if err != nil {
res.Respond(err.Error(), http.Bad)
next(err)
return
}
res.SetHeader("Content-Type", "application/json")
res.SendBytes(enc, http.Ok)
// move on to other handlers
next(nil)
}