code: func (h *Handler) siteSessionGenerate(w http.ResponseWriter, r *http.Request, p httprouter.Params, ctx *SessionContext, site reversetunnel.RemoteSite) (interface{}, error) {
  	namespace := p.ByName("namespace")
  	if !services.IsValidNamespace(namespace) {
  		return nil, trace.BadParameter("invalid namespace %q", namespace)
  	}
  
  	var req *siteSessionGenerateReq
  	if err := httplib.ReadJSON(r, &req); err != nil {
  		return nil, trace.Wrap(err)
  	}
  	req.Session.ID = session.NewID()
  	req.Session.Created = time.Now().UTC()
  	req.Session.LastActive = time.Now().UTC()
  	req.Session.Namespace = namespace
  	log.Infof("Generated session: %#v", req.Session)
  	return siteSessionGenerateResponse{Session: req.Session}, nil
  }
docs: // siteSessionCreate generates a new site session that can be used by UI
  //
  // POST /v1/webapi/sites/:site/sessions
  //
  // Request body:
  //
  // {"session": {"terminal_params": {"w": 100, "h": 100}, "login": "centos"}}
  //
  // Response body:
  //
  // {"session": {"id": "session-id", "terminal_params": {"w": 100, "h": 100}, "login": "centos"}}
  //