private async Task <bool> TryConnect() { if (connection != null) { return(true); } if (config == null || string.IsNullOrWhiteSpace(config.Address)) { lastConnectErrMsg = "No address configured"; return(false); } try { var(host, port, user, pass, moduleID) = GetLogin(config); connection = await HttpConnection.ConnectWithUserLogin(host, port, user, pass, timeoutSeconds : 2); lastConnectErrMsg = ""; this.moduleID = moduleID; this.mapId2Info = config.GetAllDataItems().Where(di => !string.IsNullOrEmpty(di.Address)).ToDictionary( item => /* key */ item.ID, item => /* val */ new ItemInfo(item, MakeVarRefFromAddress(item.Address, moduleID))); return(true); } catch (Exception exp) { Exception baseExp = exp.GetBaseException() ?? exp; lastConnectErrMsg = baseExp.Message; LogWarn("Connect", "Connection error: " + baseExp.Message, details: baseExp.StackTrace); await CloseConnection(); return(false); } }
private async Task <ReqResult> HandlePost(HttpRequest request, HttpResponse response) { string path = request.Path; try { if (path == Path_Login) { string?user; string?pass; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { var obj = await StdJson.JObjectFromReaderAsync(reader); user = (string?)obj["user"]; pass = (string?)obj["pass"]; if (user == null || pass == null) { return(ReqResult.Bad("Missing user and password.")); } } var session = new Session(); Connection connection; try { connection = await HttpConnection.ConnectWithUserLogin("localhost", clientPort, user, pass, null, session, timeoutSeconds : 90); } catch (Exception exp) { logWarn(exp.Message); return(ReqResult.Bad(exp.Message)); } await session.SetConnection(connection, model, moduleID, viewTypes); sessions[session.ID] = session; var result = new JObject(); result["sessionID"] = session.ID; string str = StdJson.ObjectToString(uiModel); JRaw raw = new JRaw(str); result["model"] = raw; return(ReqResult.OK(result)); } else if (path.StartsWith(Path_ViewReq)) { string viewRequest = path.Substring(Path_ViewReq.Length); (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string content; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { content = await reader.ReadToEndAsync(); } return(await session.OnViewCommand(viewID, viewRequest, DataValue.FromJSON(content))); } else if (path == Path_ActivateView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); await session.OnActivateView(viewID); return(ReqResult.OK()); } else if (path == Path_DuplicateView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string newViewID = await session.OnDuplicateView(viewID); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { newViewID, model = uiModel })); } else if (path == Path_DuplicateConvertView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string newViewID = await session.OnDuplicateConvertHistoryPlot(viewID); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { newViewID, model = uiModel })); } else if (path == Path_RenameView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); string?newViewName; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { var obj = await StdJson.JObjectFromReaderAsync(reader); newViewName = (string?)obj["newViewName"]; if (newViewName == null) { return(ReqResult.Bad("Missing newViewName")); } } await session.OnRenameView(viewID, newViewName); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { model = uiModel })); } else if (path == Path_MoveView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); bool up = false; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { var obj = await StdJson.JObjectFromReaderAsync(reader); up = (bool)obj["up"] !; } await session.OnMoveView(viewID, up); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { model = uiModel })); } else if (path == Path_DeleteView) { (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString()); await session.OnDeleteView(viewID); uiModel = MakeUiModel(model, viewTypes); return(ReqResult.OK(new { model = uiModel })); } else if (path == Path_Logout) { string sessionID; using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { sessionID = await reader.ReadToEndAsync(); } if (sessions.ContainsKey(sessionID)) { Session session = sessions[sessionID]; var ignored = session.Close(); sessions.Remove(sessionID); } return(ReqResult.OK()); } else { return(ReqResult.Bad("Invalid path: " + path)); } } catch (InvalidSessionException exp) { logWarn("HandlePost: " + exp.Message); return(ReqResult.Bad(exp.Message)); } catch (Exception exp) { logWarn("HandlePost:", exp); return(ReqResult.Bad(exp.Message)); } }