private bool ConnectionManager(TcpClient tcpClient) { var objStream = tcpClient.GetStream(); var strRawClientRequestHeader = SocketWorker.ReadClientData(objStream); if (!String.IsNullOrEmpty(strRawClientRequestHeader)) { var headerRequest = new HTTP.Parsers.Request(strRawClientRequestHeader); headerRequest.Add("ClientIP", tcpClient.Client.RemoteEndPoint.ToString()); SocketWorker.Do(ref headerRequest, ref objStream); } return(true); }
/// <summary> /// После состоявшегося запроса от клиента, требуется понять как это дело обработать. Эта функция прогоняет таблицу добавленных воркеров и завершает работу на первом сработавшем триггере. /// </summary> /// <param name="clientHeader">Обработанный запрос клиента</param> /// <param name="objStream">Поток для чтения или записи </param> /// <returns></returns> public void Do(ref HTTP.Parsers.Request clientHeader, ref NetworkStream objStream) { Response objResponse = null; var JobType = Worker.JobType.Other; // пробуем отработать воркеры if (Items != null && Items.Count > 0) { foreach (var Item in Items) { if (CheckPattern(clientHeader, Item.Value)) { objResponse = Item.Value.SocketWorkerFunction(clientHeader, objStream); JobType = Item.Value.SocketWorkerJobType; break; } } } // если Response == null значит подходящего воркера не нашлось, пробуем тупо отдать файл if (objResponse == null) { var strFileName = MakeLocalFilePath(clientHeader); if (!String.IsNullOrEmpty(strFileName) && CheckFile(strFileName)) { objResponse = new Response(strFileName); JobType = JobType.SendFile; } } // если Response == null значит подходящих воркера или файлоа не нашлось, отдаём Not Found if (objResponse == null) { objResponse = new Response("404", HttpStatusCode.NotFound); JobType = JobType.SendCode; } switch (JobType) { case JobType.Other: case JobType.SendText: case JobType.SendCode: case JobType.SendFile: WriteClientData(objStream, objResponse); break; } }
/// <summary> /// /// </summary> /// <param name="clientHeader"></param> /// <param name="socketWorkerItem"></param> /// <returns></returns> private bool CheckPattern(HTTP.Parsers.Request clientHeader, SocketWorkerItem socketWorkerItem) { switch (socketWorkerItem.SocketWorkerEntryType) { case EntryType.Url: if (!String.IsNullOrEmpty(clientHeader.Get("EntryPoint"))) { var strEntryPoint = clientHeader.Get("EntryPoint"); return(Strings.Contains(strEntryPoint, socketWorkerItem.strEntryPointPattern, socketWorkerItem.SocketWorkerEntryAnalysisType)); } break; case EntryType.Command: if (clientHeader.Query != null) { if (clientHeader.Query.Get(strCommand) != null) { var strTmp = clientHeader.Query.Get(strCommand); return(String.Equals(strTmp, socketWorkerItem.strEntryPointPattern)); } } break; case EntryType.Method: var strMethod = clientHeader.Get("Method"); if (!String.IsNullOrEmpty(strMethod)) { return(Strings.Contains(strMethod, socketWorkerItem.strEntryPointPattern, socketWorkerItem.SocketWorkerEntryAnalysisType)); } break; case EntryType.Header: if (!String.IsNullOrEmpty(clientHeader.Get(socketWorkerItem.strEntryPointPattern))) { return(true); } break; } return(false); }
private string MakeLocalFilePath(HTTP.Parsers.Request ClientHeader) { if (!String.IsNullOrEmpty(strRootDirectory)) { var strPath = strRootDirectory; if (!String.IsNullOrEmpty(ClientHeader.Get("Path"))) { strPath += ClientHeader.Get("Path"); } if (!String.IsNullOrEmpty(ClientHeader.Get("EntryPoint")) && ClientHeader.Get("EntryPoint") != "/") { strPath += ClientHeader.Get("EntryPoint"); return(Files.FixPathByOS(strPath)); } } return(null); }
/// <summary> /// /// </summary> /// <param name="clientHeader"></param> /// <param name="objStreem"></param> /// <returns></returns> private Response EmptyWorker(HTTP.Parsers.Request clientHeader, NetworkStream objStreem) => new Response("", HttpStatusCode.OK);