// Убираем старую версию распределения запросов и делаем ниже новую машрузитацию public void route(HttpProcessor p) { string ContentType = "text/html"; string Extension = ""; //Переменная для определения запуска процедуры т.е. если клиент ввел http://localhost/index -> вызовет процедуру RouterProcedure::index string RoutePath = p.http_url; //Убираем / в начале if (RoutePath.IndexOf('/') != -1) RoutePath = RoutePath.Substring(RoutePath.IndexOf('/') + 1); //если был GET запрос его тоже убираем if (RoutePath.IndexOf('?') != -1) RoutePath = RoutePath.Remove(RoutePath.IndexOf('?')); //проверяем на скачку файла т.е. если введено http://localhost/css/style.css, то передаем переменной Extension ".css" if (RoutePath.IndexOf('.') != -1) Extension = p.http_url.Substring(p.http_url.LastIndexOf('.')); //Проверяем на скачку,если Extension больше 0, даем скачать файл if (Extension.Length != 0) { switch (Extension) { case ".css": ContentType = "text/css"; break; case ".js": ContentType = "text/javascript"; break; case ".jpg": ContentType = "image/jpeg"; break; case ".jpeg": case ".png": case ".gif": ContentType = "image/" + Extension.Substring(1); break; default: if (Extension.Length > 1) { ContentType = "application/" + Extension.Substring(1); } else { ContentType = "application/unknown"; } break; } FileStream FS; try { FS = new FileStream(@"C:\Project\Access\d2" + p.http_url, FileMode.Open, FileAccess.Read, FileShare.Read); //Отправка Заголовка. string Headers = "HTTP/1.1 200 OK\nContent-Type: " + ContentType + "\nContent-Length: " + FS.Length + "\n\n"; byte[] HeadersBuffer = Encoding.UTF8.GetBytes(Headers); p.socket.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length); // Буфер для отправки клиенту данных byte[] Buffer = new byte[1024]; // Переменная для хранения количества байт, переданных клиенту int Count; while (FS.Position < FS.Length) { // Читаем данные из файла Count = FS.Read(Buffer, 0, Buffer.Length); // И передаем их клиенту p.socket.GetStream().Write(Buffer, 0, Count); } FS.Close(); } catch (Exception) { // Если случилась ошибка, посылаем клиенту ошибку 500 p.outputStream.Write("HTTP/1.0 404 File not found\n"); p.outputStream.Write("Connection: close\n\n"); } return; } else { Sessions = new Session(p); //если происходит вызов http://localhost/index -> вызовет процедуру RouterProcedure::index RouterProcedure mc = new RouterProcedure(); //если будет вызов http://localhost/index/login, то будет искать процедуру index, передаст в параметр а login string[] MasRoutePathFormat = RoutePath.Split('/'); MethodInfo m = mc.GetType().GetMethod(MasRoutePathFormat[0], BindingFlags.Instance | BindingFlags.Public); //Запускаем и передаем параметр: //p-сервер, //MasRoutePathFormat-путь по которуму пришел пользователь //connect - mysql соединение try { m.Invoke(mc, new Object[] { p, MasRoutePathFormat }); } catch (Exception) { p.redirect("http://localhost:8080/index"); return; } //Сохраняем данные для сессии Sessions.push(); //отправляем юзеру p.SendToUsers(MasRoutePathFormat[0]); connect.close(); } }