//go:build standalone package checker import ( "errors" "net/http" "strconv" "strings" sdk "git.happydns.org/checker-sdk-go/checker" ) // RenderForm exposes the inputs needed to drive a STUN/TURN check from // the standalone HTML form. The fields mirror the canonical option // documentation in Definition() (RunOpts then UserOpts) so the form // stays in lock-step with the JSON schema served at /definition. func (p *stunTurnProvider) RenderForm() []sdk.CheckerOptionField { def := p.Definition() fields := make([]sdk.CheckerOptionField, 0, len(def.Options.RunOpts)+len(def.Options.UserOpts)) fields = append(fields, def.Options.RunOpts...) fields = append(fields, def.Options.UserOpts...) return fields } // ParseForm turns the submitted form into a CheckerOptions. At least one // of zone or serverURI must be provided so discoverEndpoints has // something to work with. func (p *stunTurnProvider) ParseForm(r *http.Request) (sdk.CheckerOptions, error) { zone := strings.TrimSpace(r.FormValue("zone")) zone = strings.TrimSuffix(zone, ".") uri := strings.TrimSpace(r.FormValue("serverURI")) if zone == "" && uri == "" { return nil, errors.New("either zone or serverURI is required") } opts := sdk.CheckerOptions{} if zone != "" { opts["zone"] = zone } if uri != "" { opts["serverURI"] = uri } if v := strings.TrimSpace(r.FormValue("mode")); v != "" { switch v { case "auto", "stun", "turn": opts["mode"] = v default: return nil, errors.New("mode must be one of: auto, stun, turn") } } for _, k := range []string{"username", "credential", "sharedSecret", "realm", "transports", "probePeer"} { if v := strings.TrimSpace(r.FormValue(k)); v != "" { opts[k] = v } } if v := r.FormValue("testChannelBind"); v != "" { opts["testChannelBind"] = v == "true" || v == "on" || v == "1" } for _, k := range []string{"warningRTT", "criticalRTT", "timeout"} { v := strings.TrimSpace(r.FormValue(k)) if v == "" { continue } n, err := strconv.ParseUint(v, 10, 32) if err != nil { return nil, errors.New(k + " must be a non-negative integer") } opts[k] = int(n) } return opts, nil }