āĻĒā§āϰāĻŦā§āĻļ
āĻāĻāĻŋ āϏāĻŦ āĻļā§āϰ⧠āĻšāϝāĻŧā§āĻāĻŋāϞ āϝāĻāύ āĻāĻāĻāύ āϏāĻšāĻāϰā§āĻŽā§ āĻāĻŽāĻžāĻā§ āĻāĻāĻāĻŋ āĻā§āĻ āĻāϝāĻŧā§āĻŦ āĻĒāϰāĻŋāώā§āĻŦāĻž āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻĒāϰāĻžāĻŽāϰā§āĻļ āĻĻā§āύāĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻŋāύā§āĻĄāĻžāϰā§āϰ āĻŽāϤ⧠āĻāĻŋāĻā§ āĻšāĻāϝāĻŧāĻžāϰ āĻāĻĨāĻž āĻāĻŋāϞ, āϤāĻŦā§ āĻāĻāĻāĻŋ āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻā§āĻāĻāĻāĻā§āϰ āĻāύā§āϝ⧎ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻžāĻāĻŋ āĻāĻā§āĻŦāĻžāϰā§āĻ āϏāĻšāĻ, āĻāĻĒāύāĻŋ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āύ, āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻĒā§āϰāĻŖ āĻāϰā§āύ āĻāĻŦāĻ āĻŽā§āϞ āĻĒāϝāĻŧā§āύā§āĻā§ āϝāĻžāύ, āϝāĻĨāĻž, āĻāĻāĻāύ āĻāĻĨā§āĻĒāĻāĻĨāύ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āϏāĻāϝā§āĻāĻā§āϞāĻŋ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰā§āύ āĻāĻŦāĻ āύāϤā§āύ āĻĒāϰāĻŋāĻāĻŋāϤāĻŋ āϤā§āϰāĻŋ āĻāϰā§āύ⧎
āĻāĻāĻžāύ⧠āĻāĻŽāĻžāĻā§ āύāĻŋāĻā§āϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻŋāĻā§āĻāĻž āĻŦāĻŋāĻā§āϰāĻžāύā§āϤ āĻāϰāϤ⧠āĻšāĻŦā§, āϝāĻžāϤ⧠āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻāĻāĻŋ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻšāϝāĻŧ āϝ⧠āĻāĻŽāĻŋ āĻā§āύ āĻāύā§āύāϝāĻŧāύ⧠āĻāĻŽāύ āĻĒāĻĻāĻā§āώā§āĻĒ āύāĻŋāϞāĻžāĻŽāĨ¤
āĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻā§āĻŽ āϏā§āĻā§āĻĄāĻŋāĻāϤ⧠āĻā§āĻāύāĻŋāĻā§āϝāĻžāϞ āĻāϰā§āĻāĻŋāϏā§āĻā§āϰ āĻĒāĻĻā§ āĻāĻāĻŋ, āĻāĻŽāĻžāϰ āϏāĻŋ# āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻ āĻāĻŋāĻā§āĻāϤāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāύāĻŋāĻāĻŋāϰ āĻāύā§āϝ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻŦāĻ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋāĻā§āϞāĻŋ āϞā§āĻāĻžāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āĻĄāĻŋāĻāĻžāĻāϏāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āύāĻŋāĻŽā§āύ-āϏā§āϤāϰā§āϰ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻĒā§āϞāĻžāĻāĻāύ āϤā§āϰāĻŋ āĻāϰāĻžāĨ¤ āĻāĻ āĻŦāĻŋāĻļā§āĻŦā§āϰ āĻŦāĻžāĻāϰā§, āĻāĻŽāĻŋ āĻāĻāύāĻ āĻŦā§āĻā§ āύāĻŋāĻāύāĻŋ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āϏā§āϝā§āĻ āϤā§āϰāĻŋ āĻāϰāĻŋāύāĻŋāĨ¤
āĻĒāĻžāϰā§āĻ 1. āĻĢā§āϰā§āĻŽ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒāĻŋāĻ
āĻāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāĻāĻŋ āĻā§āĻŽāύ āĻšāĻŦā§ āϤāĻž āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āĻāϝāĻŧāĻžāϰ āĻĒāϰā§, āĻāĻŽāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āϏāύā§āϧāĻžāύ āĻāϰāϤ⧠āĻļā§āϰ⧠āĻāϰāĻŋāĨ¤ āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻ āĻāĻĒāĻžāϝāĻŧ āĻš'āϞ āĻāĻŋāĻā§ āϧāϰāĻŖā§āϰ āϰā§āĻĄāĻŋāĻŽā§āĻĄ āϏāĻŽāĻžāϧāĻžāύ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻž, āϝāĻžāϰ āĻāĻĒāϰ, āĻāĻāĻāĻŋ āĻā§āϞā§āĻŦā§āϰ āĻĒā§āĻāĻāĻžāϰ āĻŽāϤā§, āĻāĻĒāύāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻŽā§āĻāĻžāύāĻŋāĻā§āϏ āĻāĻžāύāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŦāĻ āĻāύāϏāĻžāϧāĻžāϰāĻŖā§āϰ āύāĻŋāύā§āĻĻāĻžāϰ āĻāύā§āϝ āĻĒā§āϰ⧠āĻāĻŋāύāĻŋāϏāĻāĻŋ āϏāĻžāĻāĻžāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āϤāĻŦā§ āĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āύāϝāĻŧ, āĻāĻŽāĻŋ āĻāϤ⧠āĻā§āύāĻ āĻā§āϝāĻžāϞā§āĻā§āĻ āĻāĻŦāĻ āĻŦā§āϧ āĻĻā§āĻāĻŋāύāĻŋ āĻāĻŦāĻ āϤāĻžāĻ āĻāĻŽāĻŋ āĻāϝāĻŧā§āĻŦ āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻā§āϰ āĻĒāĻĻā§āϧāϤāĻŋāĻā§āϞāĻŋ āĻ
āϧā§āϝāϝāĻŧāύ āĻāϰāϤ⧠āĻļā§āϰ⧠āĻāϰāĻŋāĨ¤
āĻāĻŦā§āώāĻŖāĻžāĻāĻŋ C# .Net-āĻ āύāĻŋāĻŦāύā§āϧ āĻāĻŦāĻ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻļā§āϰ⧠āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻāĻžāύ⧠āĻāĻŽāĻŋ āĻāĻžāĻāĻāĻŋ āϏāĻŽā§āĻĒāύā§āύ āĻāϰāĻžāϰ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻĒāĻžāϝāĻŧ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻāĻŋāĨ¤ ASP.Net āĻŦāĻž Azure āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻŽāϤ⧠āĻĒā§āϰā§āĻŖāĻžāĻā§āĻ āϏāĻŽāĻžāϧāĻžāύ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰ⧠TcpHttp āϏāĻāϝā§āĻāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϏāϰāĻžāϏāϰāĻŋ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž āĻĒāϰā§āϝāύā§āϤ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ āύā§āĻāĻā§āϞāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āϰāϝāĻŧā§āĻā§ā§ˇ
ASP āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻĨāĻŽ āĻĒā§āϰāĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāĻŋ āĻ āĻŦāĻŋāϞāĻŽā§āĻŦā§ āĻāĻāĻŋ āĻŦāĻžāϤāĻŋāϞ āĻāϰ⧠āĻĻāĻŋāϝāĻŧā§āĻāĻŋ, āĻāĻŽāĻžāϰ āĻŽāϤ⧠āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻāύā§āϝ āĻā§āĻŦ āĻāĻ āĻŋāύ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āĻāĻŋāϞāĨ¤ āĻāĻŽāϰāĻž āĻāĻ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§āϰ āĻā§āώāĻŽāϤāĻžāϰ āĻāĻ āϤā§āϤā§āϝāĻŧāĻžāĻāĻļāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ āύāĻž, āϤāĻžāĻ āĻāĻŽāĻŋ āĻāĻŽāĻžāϰ āĻ āύā§āϏāύā§āϧāĻžāύ āĻāĻžāϞāĻŋāϝāĻŧā§ āĻā§āϞāĻžāĻŽāĨ¤ āĻāĻŋāϏāĻŋāĻĒāĻŋ āĻāĻŦāĻ āĻāĻāĻāĻāĻŋāĻāĻŋāĻĒāĻŋ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ-āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻŽāϧā§āϝ⧠āĻĒāĻāύā§āĻĻāĻāĻŋ āĻāϏā§āĻā§āĨ¤ āĻāĻāĻžāύā§, āĻšāĻžāĻŦā§āϰā§āϤā§, āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āύāĻŋāĻŦāύā§āϧ āĻā§āĻĄāĻŧā§ āĻāϏā§āĻāĻŋ , āϝāĻž āϏāĻāĻā§āϰāĻš āĻāĻŦāĻ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāĻŋ TCP āϏāĻāϝā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāĻžāϰ āĻāĻĒāϰ āĻĢā§āĻāĻžāϏ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋ, āĻāĻŋāĻā§ āĻāĻžāϰāĻŖā§ āĻāĻŽāĻŋ āĻā§āĻŦā§āĻāĻŋāϞāĻžāĻŽ āϝ⧠http āĻāĻŽāĻžāĻā§ āĻāĻāĻāĻŋ āĻā§āϰāϏ-āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āϏāĻŽāĻžāϧāĻžāύ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āĻŦā§ āύāĻžāĨ¤
āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻĒā§āϰāĻĨāĻŽ āϏāĻāϏā§āĻāϰāĻŖā§ āϏāĻāϝā§āĻāĻā§āϞāĻŋ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻž, āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻāϝāĻŧā§āĻŦ āĻĒā§āώā§āĻ āĻžāϰ āϏāĻžāĻŽāĻā§āϰ⧠āĻĒāϰāĻŋāĻŦā§āĻļāύ āĻāϰāĻž āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāĻŋāϞāĨ¤ āĻāĻŦāĻ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŽāĻŋ āϏāĻžāĻāĻā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ⧠āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋ, āϝāĻžāϤ⧠āĻĒāϰ⧠āĻāĻŽāĻŋ āĻāĻāĻžāύ⧠āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āĻāĻŦāĻ āĻāĻāĻāĻāϏ-āĻ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖāĻā§ āĻāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻāĻāĻžāύ⧠āĻāĻŋāĻā§ āĻā§āĻĄ āĻāĻā§
āĻāĻāĻāĻŋ āĻ
āύā§āϤāĻšā§āύ āϞā§āĻĒā§ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻā§āϰāĻšāĻŖāĻāĻžāϰ⧠āĻĒā§āϰāϧāĻžāύ āĻĨā§āϰā§āĻĄ:
using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ClearServer
{
class Server
{
TcpListener Listener;
public Server(int Port)
{
Listener = new TcpListener(IPAddress.Any, Port);
Listener.Start();
while (true)
{
TcpClient Client = Listener.AcceptTcpClient();
Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
Thread.Start(Client);
}
}
static void ClientThread(Object StateInfo)
{
new Client((TcpClient)StateInfo);
}
~Server()
{
if (Listener != null)
{
Listener.Stop();
}
}
static void Main(string[] args)
{
DatabaseWorker sqlBase = DatabaseWorker.GetInstance;
new Server(80);
}
}
}
āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āύāĻŋāĻā§āĻ:
using System; using System.IO; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; namespace ClearServer { class Client { public Client(TcpClient Client) { string Message = ""; byte[] Buffer = new byte[1024]; int Count; while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) { Message += Encoding.UTF8.GetString(Buffer, 0, Count); if (Message.IndexOf("rnrn") >= 0 || Message.Length > 4096) { Console.WriteLine(Message); break; } } Match ReqMatch = Regex.Match(Message, @"^w+s+([^s?]+)[^s]*s+HTTP/.*|"); if (ReqMatch == Match.Empty) { ErrorWorker.SendError(Client, 400); return; } string RequestUri = ReqMatch.Groups[1].Value; RequestUri = Uri.UnescapeDataString(RequestUri); if (RequestUri.IndexOf("..") >= 0) { ErrorWorker.SendError(Client, 400); return; } if (RequestUri.EndsWith("/")) { RequestUri += "index.html"; } string FilePath =quot;D:/Web/TestSite{RequestUri}";
if (!File.Exists(FilePath))
{
ErrorWorker.SendError(Client, 404);
return;
}string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.'));
string ContentType = "";
switch (Extension)
{
case ".htm":
case ".html":
ContentType = "text/html";
break;
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 =quot;image/{Extension.Substring(1)}";
break;
default:
if (Extension.Length > 1)
{
ContentType =quot;application/{Extension.Substring(1)}";
}
else
{
ContentType = "application/unknown";
}
break;
}FileStream FS;
try
{
FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (Exception)
{
ErrorWorker.SendError(Client, 500);
return;
}string Headers =
quot;HTTP/1.1 200 OKnContent-Type: {ContentType}nContent-Length: {FS.Length}nn";
byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);while (FS.Position < FS.Length)
{
Count = FS.Read(Buffer, 0, Buffer.Length);
Client.GetStream().Write(Buffer, 0, Count);
}FS.Close();
Client.Close();
}
}
}
āĻāĻŦāĻ āϏā§āĻĨāĻžāύā§āϝāĻŧ SQL āĻ āύāĻŋāϰā§āĻŽāĻŋāϤ āĻĒā§āϰāĻĨāĻŽ āĻĄāĻžāĻāĻžāĻŦā§āϏ:using System; using System.Data.Linq; namespace ClearServer { class DatabaseWorker { private static DatabaseWorker instance; public static DatabaseWorker GetInstance { get { if (instance == null) instance = new DatabaseWorker(); return instance; } } private DatabaseWorker() { string connectionStr = databasePath; using (DataContext db = new DataContext(connectionStr)) { Table<User> users = db.GetTable<User>(); foreach (var item in users) { Console.WriteLine(quot;{item.login} {item.password}");
}
}
}
}
}
āĻāĻĒāύāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻā§āύ, āĻāĻ āϏāĻāϏā§āĻāϰāĻŖāĻāĻŋ āύāĻŋāĻŦāύā§āϧā§āϰ āĻĨā§āĻā§ āϏāĻžāĻŽāĻžāύā§āϝ āĻāĻŋāύā§āύāĨ¤ āĻĒā§āϰāĻā§āϤāĻĒāĻā§āώā§, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāϰ⧠āĻāĻāĻāĻŋ āĻĢā§āϞā§āĻĄāĻžāϰ āĻĨā§āĻā§ āĻĒā§āώā§āĻ āĻž āϞā§āĻĄ āĻāϰāĻž āĻāĻŦāĻ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻāĻžāύ⧠āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ (āϝāĻž, āĻāĻĒāĻžāϝāĻŧ āĻĻā§āĻŦāĻžāϰāĻž, āĻā§āϞ āϏāĻāϝā§āĻ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ āĻāĻžāϰāĻŖā§ āĻāĻ āϏāĻāϏā§āĻāϰāĻŖā§ āĻāĻžāĻ āĻāϰā§āύāĻŋ)āĨ¤āĻ āϧā§āϝāĻžāϝāĻŧ 2
āϏāĻžāϰā§āĻāĻžāϰ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāĻŋ āĻāĻĒāϏāĻāĻšāĻžāϰ⧠āĻāϏā§āĻāĻŋ āϝ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āϏāĻŽāĻžāϧāĻžāύ āĻšāĻŦā§ (āϏā§āĻĒāϝāĻŧāϞāĻžāϰ: āύāĻž), āĻāĻŽāĻžāĻĻā§āϰ āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻāύā§āϝ, āϤāĻžāĻ āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋ āϝā§āĻā§āϤāĻŋ āĻ āϰā§āĻāύ āĻāϰāϤ⧠āĻļā§āϰ⧠āĻāϰā§āĻāĻŋāϞāĨ¤
āϧāĻžāĻĒā§ āϧāĻžāĻĒā§, āύāϤā§āύ āĻŽāĻĄāĻŋāĻāϞ āĻāĻŦāĻŋāϰā§āĻā§āϤ āĻšāϤ⧠āĻļā§āϰ⧠āĻāϰ⧠āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻšāϝāĻŧāĨ¤ āϏāĻžāϰā§āĻāĻžāϰ āĻāĻāĻāĻŋ āĻĒāϰā§āĻā§āώāĻžāĻŽā§āϞāĻ āĻĄā§āĻŽā§āĻāύ āĻ āϰā§āĻāύ āĻāϰ⧠āĻāĻŦāĻ SSL āϏāĻāϝā§āĻ āĻāύāĻā§āϰāĻŋāĻĒāĻļāύāĨ¤āϏāĻžāϰā§āĻāĻžāϰā§āϰ āϝā§āĻā§āϤāĻŋ āĻāĻŦāĻ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻāĻĻā§āϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻŦāϰā§āĻŖāύāĻž āĻāϰ⧠āĻāĻāĻā§ āĻŦā§āĻļāĻŋ āĻā§āĻĄ
āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻāĻāĻāĻŋ āĻāĻĒāĻĄā§āĻ āϏāĻāϏā§āĻāϰāĻŖ, āĻāĻāĻāĻŋ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏāĻšāĨ¤using System; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Security; using System.Security.Cryptography.X509Certificates; using System.Security.Permissions; using System.Security.Policy; using System.Threading; namespace ClearServer { sealed class Server { readonly bool ServerRunning = true; readonly TcpListener sslListner; public static X509Certificate serverCertificate = null; Server() { serverCertificate = X509Certificate.CreateFromSignedFile(@"C:sslitinder.online.crt"); sslListner = new TcpListener(IPAddress.Any, 443); sslListner.Start(); Console.WriteLine("Starting server.." + serverCertificate.Subject + "n" + Assembly.GetExecutingAssembly().Location); while (ServerRunning) { TcpClient SslClient = sslListner.AcceptTcpClient(); Thread SslThread = new Thread(new ParameterizedThreadStart(ClientThread)); SslThread.Start(SslClient); } } static void ClientThread(Object StateInfo) { new Client((TcpClient)StateInfo); } ~Server() { if (sslListner != null) { sslListner.Stop(); } } public static void Main(string[] args) { if (AppDomain.CurrentDomain.IsDefaultAppDomain()) { Console.WriteLine("Switching another domain"); new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase }; var current = AppDomain.CurrentDomain; var strongNames = new StrongName[0]; var domain = AppDomain.CreateDomain( "ClearServer", null, current.SetupInformation, new PermissionSet(PermissionState.Unrestricted), strongNames); domain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location); } new Server(); } } }āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ ssl āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ āύā§āĻŽā§āĻĻāύ āϏāĻš āĻāĻāĻāĻŋ āύāϤā§āύ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ:
using ClearServer.Core.Requester; using System; using System.Net.Security; using System.Net.Sockets; namespace ClearServer { public class Client { public Client(TcpClient Client) { SslStream SSlClientStream = new SslStream(Client.GetStream(), false); try { SSlClientStream.AuthenticateAsServer(Server.serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: true); } catch (Exception e) { Console.WriteLine( "---------------------------------------------------------------------n" +quot;|{DateTime.Now:g}n|------------n|{Client.Client.RemoteEndPoint}n|------------n|Exception: {e.Message}n|------------n|Authentication failed - closing the connection.n" +
"---------------------------------------------------------------------n");
SSlClientStream.Close();
Client.Close();
}
new RequestContext(SSlClientStream, Client);
}}
}
āĻāĻŋāύā§āϤ⧠āϝā§āĻšā§āϤ⧠āϏāĻžāϰā§āĻāĻžāϰ āĻāĻŋāϏāĻŋāĻĒāĻŋ āϏāĻāϝā§āĻā§ āĻāĻāĻā§āĻāĻŋāϝāĻŧāĻžāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§, āϤāĻžāĻ āĻāĻāĻāĻŋ āĻŽāĻĄāĻŋāĻāϞ āϤā§āϰāĻŋ āĻāϰāĻž āĻĒā§āϰāϝāĻŧā§āĻāύ āϝāĻž āĻ āύā§āϰā§āϧā§āϰ āĻĒā§āϰāϏāĻā§āĻ āĻāĻŋāύāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽāĻŋ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋ āϝ⧠āĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ āĻĒāĻžāϰā§āϏāĻžāϰ āĻāĻĒāϝā§āĻā§āϤ āϝā§āĻāĻŋ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻā§āϰ āĻ āύā§āϰā§āϧāĻāĻŋāĻā§ āĻāϞāĻžāĻĻāĻž āĻ āĻāĻļā§ āĻŦāĻŋāĻāĻā§āϤ āĻāϰāĻŦā§ āϝāĻžāϰ āϏāĻžāĻĨā§ āĻāĻŽāĻŋ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻāĻā§ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻāϤā§āϤāϰ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āϝā§āĻāĻžāϝā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤āĻĒāĻžāϰā§āϏāĻžāϰ
using ClearServer.Core.UserController; using ReServer.Core.Classes; using System; using System.Collections.Generic; using System.Linq; using System.Net.Security; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; namespace ClearServer.Core.Requester { public class RequestContext { public string Message = ""; private readonly byte[] buffer = new byte[1024]; public string RequestMethod; public string RequestUrl; public User RequestProfile; public User CurrentUser = null; public List<RequestValues> HeadersValues; public List<RequestValues> FormValues; private TcpClient TcpClient; private event Action<SslStream, RequestContext> OnRead = RequestHandler.OnHandle; DatabaseWorker databaseWorker = new DatabaseWorker(); public RequestContext(SslStream ClientStream, TcpClient Client) { this.TcpClient = Client; try { ClientStream.BeginRead(buffer, 0, buffer.Length, ClientRead, ClientStream); } catch { return; } } private void ClientRead(IAsyncResult ar) { SslStream ClientStream = (SslStream)ar.AsyncState; if (ar.IsCompleted) { Message = Encoding.UTF8.GetString(buffer); Message = Uri.UnescapeDataString(Message); Console.WriteLine(quot;n{DateTime.Now:g} Client IP:{TcpClient.Client.RemoteEndPoint}n{Message}");
RequestParse();
HeadersValues = HeaderValues();
FormValues = ContentValues();
UserParse();
ProfileParse();
OnRead?.Invoke(ClientStream, this);
}
}private void RequestParse()
{
Match methodParse = Regex.Match(Message, @"(^w+)s+([^s?]+)[^s]*s+HTTP/.*|");
RequestMethod = methodParse.Groups[1].Value.Trim();
RequestUrl = methodParse.Groups[2].Value.Trim();
}
private void UserParse()
{
string cookie;
try
{
if (HeadersValues.Any(x => x.Name.Contains("Cookie")))
{
cookie = HeadersValues.FirstOrDefault(x => x.Name.Contains("Cookie")).Value;
try
{
CurrentUser = databaseWorker.CookieValidate(cookie);
}
catch { }
}
}
catch { }}
private List<RequestValues> HeaderValues()
{
var values = new List<RequestValues>();
var parse = Regex.Matches(Message, @"(.*?): (.*?)n");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim()
});
}
return values;
}private void ProfileParse()
{
if (RequestUrl.Contains("@"))
{
RequestProfile = databaseWorker.FindUser(RequestUrl.Substring(2));
RequestUrl = "/profile";
}
}
private List<RequestValues> ContentValues()
{
var values = new List<RequestValues>();
var output = Message.Trim('n').Split().Last();
var parse = Regex.Matches(output, @"([^&].*?)=([^&]*b)");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim().Replace('+', ' ')
});
}
return values;
}
}
}
āĻāϰ āϏāĻžāϰāĻžāĻāĻļ āĻāĻ āϏāϤā§āϝā§āϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ āϝ⧠āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύā§āϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻ āύā§āϰā§āϧāĻāĻŋāĻā§ āĻ āĻāĻļā§ āĻŦāĻŋāĻāĻā§āϤ āĻāϰāĻžāĨ¤ āĻāĻŽāϰāĻž āĻā§āϞāĻžāϝāĻŧā§āύā§āĻā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āĻĒāĻžāĻ, āĻĒā§āϰāĻĨāĻŽ āϞāĻžāĻāύāĻāĻŋ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ, āϝāĻžāϰ āĻŽāϧā§āϝ⧠āĻĒāĻĻā§āϧāϤāĻŋ āĻāĻŦāĻ āĻ āύā§āϰā§āϧā§āϰ url āϰāϝāĻŧā§āĻā§āĨ¤ āϤāĻžāϰāĻĒāϰ⧠āĻāĻŽāϰāĻž āĻļāĻŋāϰā§āύāĻžāĻŽāĻā§āϞāĻŋ āĻĒāĻĄāĻŧāĻŋ, āϝā§āĻā§āϞāĻŋāĻā§ āĻāĻŽāϰāĻž HeaderName = Content āĻĢāϰā§āĻŽā§āϰ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰā§āϤ⧠āĻĄā§āϰāĻžāĻāĻ āĻāϰāĻŋ, āĻāĻŦāĻ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āϝāĻĻāĻŋ āĻĨāĻžāĻā§, āϏāĻžāĻĨā§ āĻĨāĻžāĻāĻž āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠(āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, querystring) āĻā§āĻāĻā§ āĻĒāĻžāĻ āϝāĻž āĻāĻŽāϰāĻž āĻāĻāĻ āĻ ā§āϝāĻžāϰā§āϤ⧠āĻĄā§āϰāĻžāĻāĻ āĻāϰāĻŋāĨ¤ āĻāĻĒāϰāύā§āϤā§, āĻĒāĻžāϰā§āϏāĻžāϰ āĻŦāϰā§āϤāĻŽāĻžāύ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻāĻŋāύāĻž āϤāĻž āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰ⧠āĻāĻŦāĻ āϤāĻžāϰ āĻĄā§āĻāĻž āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āĨ¤ āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻāĻĻā§āϰ āĻĨā§āĻā§ āϏāĻŽāϏā§āϤ āĻ āύā§āϰā§āϧ⧠āĻāĻāĻāĻŋ āĻ āύā§āĻŽā§āĻĻāύ āĻšā§āϝāĻžāĻļ āĻĨāĻžāĻā§, āϝāĻž āĻā§āĻāĻŋāϤ⧠āϏāĻāϰāĻā§āώāĻŋāϤ āĻĨāĻžāĻā§, āϝāĻžāϰ āĻāĻžāϰāĻŖā§ āĻĻā§āĻ āϧāϰāύā§āϰ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻā§āϰ āĻāύā§āϝ āĻāϰāĻ āĻāĻžāĻā§āϰ āϝā§āĻā§āϤāĻŋ āĻāϞāĻžāĻĻāĻž āĻāϰāĻž āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āϏāĻ āĻŋāĻ āĻāϤā§āϤāϰ āĻĻā§āĻāϝāĻŧāĻž āϏāĻŽā§āĻāĻŦāĨ¤āĻ āĻŋāĻ āĻāĻā§, āĻāĻāĻāĻŋ āĻā§āĻ, āϏā§āύā§āĻĻāϰ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϝāĻž āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻŽāĻĄāĻŋāĻāϞ⧠āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰāĻŋāϤ āĻāϰāĻž āĻāĻāĻŋāϤ, "site.com/@UserName" āĻāϰ āĻŽāϤ⧠āĻ āύā§āϰā§āϧāĻā§āϞāĻŋāĻā§ āĻāϤāĻŋāĻļā§āϞāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻšāĻāϝāĻŧāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒā§āώā§āĻ āĻžāĻā§āϞāĻŋāϤ⧠āϰā§āĻĒāĻžāύā§āϤāϰāĻŋāϤ āĻāϰā§ā§ˇ āĻ āύā§āϰā§āϧāĻāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻžāϰ āĻĒāϰā§, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŽāĻĄāĻŋāĻāϞāĻā§āϞāĻŋ āĻāĻžāϰā§āϝāĻāϰ āĻšāϝāĻŧāĨ¤
āĻ āϧā§āϝāĻžāϝāĻŧ 3. āĻšā§āϝāĻžāύā§āĻĄā§āϞāĻŦāĻžāϰ āĻāύāϏā§āĻāϞ āĻāϰāĻž, āĻā§āĻāύ āϞā§āĻŦā§āϰāĻŋāĻā§āĻāĻŋāĻ
āĻĒāĻžāϰā§āϏāĻžāϰā§āϰ āĻāĻžāĻ āĻļā§āώ āĻšāĻāϝāĻŧāĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§, āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āĻāĻžāĻ āĻāϰā§, āϏāĻžāϰā§āĻāĻžāϰāĻā§ āĻāϰāĻ āύāĻŋāϰā§āĻĻā§āĻļ āĻĻā§āϝāĻŧ āĻāĻŦāĻ āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖāĻā§ āĻĻā§āĻāĻŋ āĻāĻžāĻā§ āĻāĻžāĻ āĻāϰā§āĨ¤
āϏāĻšāĻ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ
using ClearServer.Core.UserController; using System.Net.Security; namespace ClearServer.Core.Requester { public class RequestHandler { public static void OnHandle(SslStream ClientStream, RequestContext context) { if (context.CurrentUser != null) { new AuthUserController(ClientStream, context); } else { new NonAuthUserController(ClientStream, context); }; } } }āĻāϏāϞā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ āύā§āĻŽā§āĻĻāύā§āϰ āĻāύā§āϝ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻā§āĻ āĻāĻā§, āϝāĻžāϰ āĻĒāϰ⧠āĻ āύā§āϰā§āϧ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻļā§āϰ⧠āĻšāϝāĻŧāĨ¤
āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰ
āϝāĻĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āύāĻž āĻšāϝāĻŧ, āϤāĻŦā§ āϤāĻžāϰ āĻāύā§āϝ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāĻŦāĻ āĻ āύā§āĻŽā§āĻĻāύ āύāĻŋāĻŦāύā§āϧāύ āĻāĻāύā§āĻĄā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰā§āĨ¤ āĻāĻāĻāĻŋ āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻā§āĻĄ āĻāĻāĻ āĻĻā§āĻāĻžāϝāĻŧ, āϤāĻžāĻ āĻāĻŽāĻŋ āĻāĻāĻŋ āύāĻāϞ āĻāϰāĻžāϰ āĻā§āύ āĻāĻžāϰāĻŖ āĻĻā§āĻāĻŋ āύāĻžāĨ¤āĻ āύāύā§āĻŽā§āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§
using ClearServer.Core.Requester; using System.IO; using System.Net.Security; namespace ClearServer.Core.UserController { internal class NonAuthUserController { private readonly SslStream ClientStream; private readonly RequestContext Context; private readonly WriteController WriteController; private readonly AuthorizationController AuthorizationController; private readonly string ViewPath = "C:/Users/drdre/source/repos/ClearServer/View"; public NonAuthUserController(SslStream clientStream, RequestContext context) { this.ClientStream = clientStream; this.Context = context; this.WriteController = new WriteController(clientStream); this.AuthorizationController = new AuthorizationController(clientStream, context); ResourceLoad(); } void ResourceLoad() { string[] blockextension = new string[] {"cshtml", "html", "htm"}; bool block = false; foreach (var item in blockextension) { if (Context.RequestUrl.Contains(item)) { block = true; break; } } string FilePath = ""; string Header = ""; var RazorController = new RazorController(Context, ClientStream); switch (Context.RequestMethod) { case "GET": switch (Context.RequestUrl) { case "/": FilePath = ViewPath + "/loginForm.html"; Header =quot;HTTP/1.1 200 OKnContent-Type: text/html";
WriteController.DefaultWriter(Header, FilePath);
break;
case "/profile":
RazorController.ProfileLoader(ViewPath);
break;
default:
//в даĐŊĐŊĐžĐŧ ĐąĐģĐžĐēĐĩ ĐēОда ĐŋŅОиŅŅ ĐžĐ´Đ¸Ņ ĐžŅŅĐĩŅĐĩĐŊиĐĩ СаĐŋŅĐžŅОв Đē ŅĐĩŅвĐĩŅŅ ĐŋĐž ĐŋŅŅĐŧĐžĐŧŅ Đ°Đ´ŅĐĩŅŅ ŅŅŅаĐŊиŅŅ Đ˛Đ¸Đ´Đ° site.com/page.html
if (!File.Exists(ViewPath + Context.RequestUrl) | block)
{
RazorController.ErrorLoader(404);}
else if (Path.HasExtension(Context.RequestUrl) && File.Exists(ViewPath + Context.RequestUrl))
{
Header = WriteController.ContentType(Context.RequestUrl);
FilePath = ViewPath + Context.RequestUrl;
WriteController.DefaultWriter(Header, FilePath);
}
break;
}
break;case "POST":
AuthorizationController.MethodRecognizer();
break;}
}
}
}
āĻāĻŦāĻ āĻ āĻŦāĻļā§āϝāĻ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻ āĻŦāĻļā§āϝāĻ āĻĒā§āώā§āĻ āĻžāĻā§āϞāĻŋāϰ āĻāĻŋāĻā§ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻā§āϰāĻšāĻŖ āĻāϰāϤ⧠āĻšāĻŦā§, āϤāĻžāĻ āĻāϤā§āϤāϰāĻā§āϞāĻŋāϰ āĻāύā§āϝ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŽāĻĄāĻŋāĻāϞāĻāĻŋ āϰāϝāĻŧā§āĻā§, āϝāĻž āϏāĻāϏā§āĻĨāĻžāύāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧā§āϰ āĻāϤā§āϤāϰ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āĻĻāĻžāϝāĻŧā§ā§ˇāϞā§āĻāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰ
using System; using System.IO; using System.Net.Security; using System.Text; namespace ClearServer.Core.UserController { public class WriteController { SslStream ClientStream; public WriteController(SslStream ClientStream) { this.ClientStream = ClientStream; } public void DefaultWriter(string Header, string FilePath) { FileStream fileStream; try { fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); Header =quot;{Header}nContent-Length: {fileStream.Length}nn";
ClientStream.Write(Encoding.UTF8.GetBytes(Header));
byte[] response = new byte[fileStream.Length];
fileStream.BeginRead(response, 0, response.Length, OnFileRead, response);
}
catch { }
}public string ContentType(string Uri)
{
string extension = Path.GetExtension(Uri);
string Header = "HTTP/1.1 200 OKnContent-Type:";
switch (extension)
{
case ".html":
case ".htm":
returnquot;{Header} text/html";
case ".css":
returnquot;{Header} text/css";
case ".js":
returnquot;{Header} text/javascript";
case ".jpg":
case ".jpeg":
case ".png":
case ".gif":
returnquot;{Header} image/{extension}";
default:
if (extension.Length > 1)
{
returnquot;{Header} application/" + extension.Substring(1);
}
else
{
returnquot;{Header} application/unknown";
}
}
}public void OnFileRead(IAsyncResult ar)
{
if (ar.IsCompleted)
{
var file = (byte[])ar.AsyncState;
ClientStream.BeginWrite(file, 0, file.Length, OnClientSend, null);
}
}public void OnClientSend(IAsyncResult ar)
{
if (ar.IsCompleted)
{
ClientStream.Close();
}
}
}
āĻāĻŋāύā§āϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āϤāĻžāϰ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻĻā§āĻāĻžāύā§āϰ āĻāύā§āϝ, āĻāĻŽāĻŋ RazorEngine āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋ, āĻŦāĻž āĻŦāϰāĻ āĻāϰ āĻāĻāĻāĻŋ āĻ āĻāĻļāĨ¤ āĻāϤ⧠āĻāĻžāϰāĻžāĻĒ āĻ āύā§āϰā§āϧāĻā§āϞāĻŋ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻž āĻāĻŦāĻ āĻāĻĒāϝā§āĻā§āϤ āϤā§āϰā§āĻāĻŋ āĻā§āĻĄ āĻāĻžāϰāĻŋ āĻāϰāĻžāĻ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤāĨ¤āϰā§āĻāĻžāϰ āĻāύā§āĻā§āϰā§āϞāĻžāϰ
using ClearServer.Core.Requester; using RazorEngine; using RazorEngine.Templating; using System; using System.IO; using System.Net; using System.Net.Security; namespace ClearServer.Core.UserController { internal class RazorController { private RequestContext Context; private SslStream ClientStream; dynamic PageContent; public RazorController(RequestContext context, SslStream clientStream) { this.Context = context; this.ClientStream = clientStream; } public void ProfileLoader(string ViewPath) { string Filepath = ViewPath + "/profile.cshtml"; if (Context.RequestProfile != null) { if (Context.CurrentUser != null && Context.RequestProfile.login == Context.CurrentUser.login) { try { PageContent = new { isAuth = true, Name = Context.CurrentUser.name, Login = Context.CurrentUser.login, Skills = Context.CurrentUser.skills }; ClientSend(Filepath, Context.CurrentUser.login); } catch (Exception e) { Console.WriteLine(e); } } else { try { PageContent = new { isAuth = false, Name = Context.RequestProfile.name, Login = Context.RequestProfile.login, Skills = Context.RequestProfile.skills }; ClientSend(Filepath, "PublicProfile:"+ Context.RequestProfile.login); } catch (Exception e) { Console.WriteLine(e); } } } else { ErrorLoader(404); } } public void ErrorLoader(int Code) { try { PageContent = new { ErrorCode = Code, Message = ((HttpStatusCode)Code).ToString() }; string ErrorPage = "C:/Users/drdre/source/repos/ClearServer/View/Errors/ErrorPage.cshtml"; ClientSend(ErrorPage, Code.ToString()); } catch { } } private void ClientSend(string FilePath, string Key) { var template = File.ReadAllText(FilePath); var result = Engine.Razor.RunCompile(template, Key, null, (object)PageContent); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result); ClientStream.BeginWrite(buffer, 0, buffer.Length, OnClientSend, ClientStream); } private void OnClientSend(IAsyncResult ar) { if (ar.IsCompleted) { ClientStream.Close(); } } } }āĻāĻŦāĻ āĻ āĻŦāĻļā§āϝāĻ, āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āϝāĻžāĻāĻžāĻāĻāϰāĻŖā§āϰ āĻāύā§āϝ, āĻ āύā§āĻŽā§āĻĻāύ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āĻ āύā§āĻŽā§āĻĻāύ āĻŽāĻĄāĻŋāĻāϞ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰā§āĨ¤ āϏāĻžāĻāĻā§āϰ āĻĢāϰā§āĻŽāĻā§āϞāĻŋ āĻĨā§āĻā§ āĻĒā§āϰāĻžāĻĒā§āϤ āĻĄā§āĻāĻž āĻĒā§āϰāϏāĻā§āĻ āĻĨā§āĻā§ āĻĒāĻžāϰā§āϏ āĻāϰāĻž āĻšāϝāĻŧ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧā§ āĻā§āĻāĻŋāĻ āĻāĻŦāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāϤ⧠āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻĒāĻžāϝāĻŧāĨ¤
āĻ āύā§āĻŽā§āĻĻāύ āĻŽāĻĄāĻŋāĻāϞ
using ClearServer.Core.Cookies; using ClearServer.Core.Requester; using ClearServer.Core.Security; using System; using System.Linq; using System.Net.Security; using System.Text; namespace ClearServer.Core.UserController { internal class AuthorizationController { private SslStream ClientStream; private RequestContext Context; private UserCookies cookies; private WriteController WriteController; DatabaseWorker DatabaseWorker; RazorController RazorController; PasswordHasher PasswordHasher; public AuthorizationController(SslStream clientStream, RequestContext context) { ClientStream = clientStream; Context = context; DatabaseWorker = new DatabaseWorker(); WriteController = new WriteController(ClientStream); RazorController = new RazorController(context, clientStream); PasswordHasher = new PasswordHasher(); } internal void MethodRecognizer() { if (Context.FormValues.Count == 2 && Context.FormValues.Any(x => x.Name == "password")) Authorize(); else if (Context.FormValues.Count == 3 && Context.FormValues.Any(x => x.Name == "regPass")) Registration(); else { RazorController.ErrorLoader(401); } } private void Authorize() { var values = Context.FormValues; var user = new User() { login = values[0].Value, password = PasswordHasher.PasswordHash(values[1].Value) }; user = DatabaseWorker.UserAuth(user); if (user != null) { cookies = new UserCookies(user.login, user.password); user.cookie = cookies.AuthCookie; DatabaseWorker.UserUpdate(user); var response = Encoding.UTF8.GetBytes(quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {cookies.AuthCookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);}
else
{
RazorController.ErrorLoader(401);}
}private void Registration()
{
var values = Context.FormValues;
var user = new User()
{
name = values[0].Value,
login = values[1].Value,
password = PasswordHasher.PasswordHash(values[2].Value),
};
cookies = new UserCookies(user.login, user.password);
user.cookie = cookies.AuthCookie;
if (DatabaseWorker.LoginValidate(user.login))
{
Console.WriteLine("User ready");
Console.WriteLine(quot;{user.password} {user.password.Trim().Length}");
DatabaseWorker.UserRegister(user);
var response = Encoding.UTF8.GetBytes(quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {user.cookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);
}
else
{
RazorController.ErrorLoader(401);
}
}
}
}
āĻāĻŦāĻ āĻĄāĻžāĻāĻžāĻŦā§āϏāĻāĻŋ āĻĻā§āĻāϤ⧠āĻāĻāϰāĻāĻŽ:āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ
using ClearServer.Core.UserController; using System; using System.Data.Linq; using System.Linq; namespace ClearServer { class DatabaseWorker { private readonly Table<User> users = null; private readonly DataContext DataBase = null; private const string connectionStr = @"ĐŋŅŅŅĐēйаСĐĩ"; public DatabaseWorker() { DataBase = new DataContext(connectionStr); users = DataBase.GetTable<User>(); } public User UserAuth(User User) { try { var user = users.SingleOrDefault(t => t.login.ToLower() == User.login.ToLower() && t.password == User.password); if (user != null) return user; else return null; } catch (Exception) { return null; } } public void UserRegister(User user) { try { users.InsertOnSubmit(user); DataBase.SubmitChanges(); Console.WriteLine(quot;User{user.name} with id {user.uid} added");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}}
public bool LoginValidate(string login)
{
if (users.Any(x => x.login.ToLower() == login.ToLower()))
{
Console.WriteLine("Login already exists");
return false;
}
return true;
}
public void UserUpdate(User user)
{
var UserToUpdate = users.FirstOrDefault(x => x.uid == user.uid);
UserToUpdate = user;
DataBase.SubmitChanges();
Console.WriteLine(quot;User {UserToUpdate.name} with id {UserToUpdate.uid} updated");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
public User CookieValidate(string CookieInput)
{
User user = null;
try
{
user = users.SingleOrDefault(x => x.cookie == CookieInput);
}
catch
{
return null;
}
if (user != null) return user;
else return null;
}
public User FindUser(string login)
{
User user = null;
try
{
user = users.Single(x => x.login.ToLower() == login.ToLower());
if (user != null)
{
return user;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
}
}
āĻāĻŦāĻ āϏāĻŦāĻāĻŋāĻā§āĻ āĻāĻĄāĻŧāĻŋāϰ āĻāĻžāĻ, āĻ āύā§āĻŽā§āĻĻāύ āĻāĻŦāĻ āύāĻŋāĻŦāύā§āϧāύā§āϰ āĻāĻžāĻā§āϰ āĻŽāϤ⧠āĻāĻžāĻ āĻāϰā§, āĻĒāϰāĻŋāώā§āĻŦāĻžāĻāĻŋāϤ⧠āĻ ā§āϝāĻžāĻā§āϏā§āϏā§āϰ āύā§āϝā§āύāϤāĻŽ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻĒāϞāĻŦā§āϧ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϞā§āĻāĻžāϰ āĻāĻŦāĻ āĻĒā§āϰ⧠āĻāĻŋāύāĻŋāϏāĻāĻŋāĻā§ āĻŽā§āϞ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻŦāĻžāĻāϧāĻžāϰ āϏāĻŽāϝāĻŧ āϝāĻžāϰ āĻāύā§āϝ āϏāĻŦāĻāĻŋāĻā§ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤āĻ āϧā§āϝāĻžāϝāĻŧ 4
āĻĻā§āĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§āϰ āĻāύā§āϝ āĻĻā§āĻāĻŋ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϞā§āĻāĻžāϰ āĻļā§āϰāĻŽ āĻāϰāĻ āĻāĻŽāĻžāϤā§, āĻāĻŽāĻŋ Xamarin.Forms-āĻ āĻāĻāĻāĻŋ āĻā§āϰāϏ-āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋāĨ¤ āĻāĻŦāĻžāϰ, āϧāύā§āϝāĻŦāĻžāĻĻ āϝ⧠āĻāĻāĻŋ C# āĻ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻāĻāĻŋ āĻĒāϰā§āĻā§āώāĻžāĻŽā§āϞāĻ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϤā§āϰāĻŋ āĻāϰ⧠āϝāĻž āĻā§āĻŦāϞ āϏāĻžāϰā§āĻāĻžāϰ⧠āĻĄā§āĻāĻž āĻĒā§āϰā§āϰāĻŖ āĻāϰā§, āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻŽā§āĻšā§āϰā§āϤā§āϰ āĻŽāϧā§āϝ⧠āĻāϞ⧠āĻāĻŋāϝāĻŧā§āĻāĻŋāϞāĻžāĻŽāĨ¤ āĻĄāĻŋāĻāĻžāĻāϏ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧā§āϰ āĻāύā§āϝ, āĻŽāĻāĻžāϰ āĻāύā§āϝ, āĻāĻŽāĻŋ āĻāĻāĻŋ HttpClient-āĻ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰā§āĻāĻŋ āĻāĻŦāĻ HttpRequestMessage āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāĻāĻŋ āĻā§āĻĄāĻŧā§ āĻĻāĻŋāϝāĻŧā§āĻāĻŋ āϝāĻžāϤ⧠json āĻŦāĻŋāύā§āϝāĻžāϏ⧠āĻ āύā§āĻŽā§āĻĻāύ āĻĢāϰā§āĻŽ āĻĨā§āĻā§ āĻĄā§āĻāĻž āϰāϝāĻŧā§āĻā§ā§ˇ āĻŦāĻŋāĻļā§āώ āĻāĻŋāĻā§ āĻāĻļāĻž āύāĻž āĻāϰā§, āĻāĻŽāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āϞāĻ āĻā§āϞāϞāĻžāĻŽ āĻāĻŦāĻ āϏā§āĻāĻžāύ⧠āϏāĻŽāϏā§āϤ āĻĄā§āĻāĻž āϏāĻš āĻĄāĻŋāĻāĻžāĻāϏ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧ āĻĻā§āĻāϞāĻžāĻŽāĨ¤ āĻšāĻžāϞāĻāĻž āϏā§āϤāĻŦā§āϧāϤāĻž, āĻāϤ 3 āϏāĻĒā§āϤāĻžāĻšā§āϰ āύāĻŋāϏā§āϤā§āĻ āϏāύā§āϧā§āϝāĻžāϝāĻŧ āϝāĻž āĻāĻŋāĻā§ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āϏāĻā§āϤāύāϤāĻžāĨ¤ āĻĒā§āϰā§āϰāĻŋāϤ āĻĄā§āĻāĻžāϰ āϏāĻ āĻŋāĻāϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤā§, āĻāĻŽāĻŋ HttpListner āĻ āĻāĻāĻāĻŋ āĻĒāϰā§āĻā§āώāĻž āϏāĻžāϰā§āĻāĻžāϰ āĻāĻāϤā§āϰāĻŋāϤ āĻāϰā§āĻāĻŋāĨ¤ āĻāĻāĻŋāϤ⧠āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻĒāϰāĻŦāϰā§āϤ⧠āĻ āύā§āϰā§āϧāĻāĻŋ āĻĒā§āϝāĻŧā§, āĻāĻŽāĻŋ āĻā§āĻĄā§āϰ āĻāϝāĻŧā§āĻāĻāĻŋ āϞāĻžāĻāύ⧠āĻāĻāĻŋāĻā§ āĻāϞāĻžāĻĻāĻž āĻāϰ⧠āύāĻŋāϝāĻŧā§āĻāĻŋ, āĻĢāϰā§āĻŽ āĻĨā§āĻā§ KeyValuePair āĻĄā§āĻāĻž āĻĒā§āϝāĻŧā§āĻāĻŋāĨ¤ āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āĻĒāĻžāϰā§āϏāĻŋāĻ āĻĻā§āĻ āϞāĻžāĻāύ⧠āĻāĻŽāĻžāύ⧠āĻšāϝāĻŧā§āĻā§āĨ¤
āĻāĻŽāĻŋ āĻāϰāĻ āĻĒāϰā§āĻā§āώāĻž āĻļā§āϰ⧠āĻāϰā§āĻāĻŋ, āĻāĻāĻŋ āĻāĻā§ āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻšāϝāĻŧāύāĻŋ, āϤāĻŦā§ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāĻŽāĻŋ āĻāĻāύāĻ āĻāϝāĻŧā§āĻŦāϏāĻā§āĻāĻā§āϞāĻŋāϤ⧠āύāĻŋāϰā§āĻŽāĻŋāϤ āĻāĻāĻāĻŋ āĻā§āϝāĻžāĻ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰā§āĻāĻŋāĨ¤ āĻāĻāĻŋ āĻŦā§āĻļ āĻāĻžāϞ āĻāĻžāĻ āĻāϰā§āĻāĻŋāϞ, āĻāĻŋāύā§āϤ⧠Tcp-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻžāϰ āύā§āϤāĻŋāĻāĻŋ āĻšāϤāĻžāĻļāĻžāĻāύāĻ āĻāĻŋāϞ, āĻāĻŋāĻ āĻŋāĻĒāϤā§āϰā§āϰ āϞāĻāĻŋāĻāϝāĻŧā§āϰ āϏāĻžāĻĨā§ āĻĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āĻā§āĻŦ āĻŦā§āĻļāĻŋ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻāϤā§āĻĒāĻžāĻĻāύ āĻāϰāϤ⧠āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ āϏāĻāϝā§āĻ āϏā§āϝā§āĻāĻāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧ āĻĒāĻžāϰā§āϏ āĻāϰāĻž āĻāĻŦāĻ RFC 6455 āĻĒā§āϰā§āĻā§āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āϏāĻāĻā§āϰāĻš āĻāϰāĻžā§ˇ āĻ āϤāĻāĻŦ, āĻĒāϰā§āĻā§āώāĻžāϰ āϏāĻžāϰā§āĻāĻžāϰā§, āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻāϝāĻŧā§āĻŦāϏāĻā§āĻ āϏāĻāϝā§āĻ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋ⧎ āĻŦāĻŋāĻļā§āĻĻā§āϧ āϏā§āĻŦāĻžāϰā§āĻĨā§āϰ āĻāύā§āϝāĨ¤
āĻā§āϝāĻžāĻ āϏāĻāϝā§āĻ
private static async void HandleWebsocket(HttpListenerContext context) { var socketContext = await context.AcceptWebSocketAsync(null); var socket = socketContext.WebSocket; Locker.EnterWriteLock(); try { Clients.Add(socket); } finally { Locker.ExitWriteLock(); } while (true) { var buffer = new ArraySegment<byte>(new byte[1024]); var result = await socket.ReceiveAsync(buffer, CancellationToken.None); var str = Encoding.Default.GetString(buffer); Console.WriteLine(str); for (int i = 0; i < Clients.Count; i++) { WebSocket client = Clients[i]; try { if (client.State == WebSocketState.Open) { await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } } catch (ObjectDisposedException) { Locker.EnterWriteLock(); try { Clients.Remove(client); i--; } finally { Locker.ExitWriteLock(); } } } } }āĻāĻŦāĻ āĻāĻāĻž āĻāĻžāĻ āĻāϰā§. āϏāĻžāϰā§āĻāĻžāϰ āύāĻŋāĻā§āĻ āϏāĻāϝā§āĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āĻā§, āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻā§ āϤā§āϰāĻŋ āĻāϰā§āĻā§āĨ¤ āĻāĻŽāύāĻāĻŋ āĻāĻŽāĻžāĻā§ āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ ssl āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏāĻžāϰā§āĻāĻžāϰ āύāĻŋāĻŦāύā§āϧāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāϤ⧠āĻšāϝāĻŧāύāĻŋ, āĻāĻāĻŋ āϝāĻĨā§āώā§āĻ āϝ⧠āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻĒā§āϰā§āĻā§ āĻāĻāĻāĻŋ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻāύāϏā§āĻāϞ āĻāϰāĻž āĻāĻā§āĨ¤
āĻĄāĻŋāĻāĻžāĻāϏā§āϰ āĻĒāĻžāĻļā§ āĻāĻŦāĻ āϏāĻžāĻāĻā§āϰ āĻĒāĻžāĻļā§, āĻĻā§āĻāĻŋ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻŦāĻžāϰā§āϤāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻāϰā§āĻā§, āĻāĻ āϏāĻŦāĻ āϞāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āĻā§āύ āĻŦāĻŋāĻļāĻžāϞ āĻĒāĻžāϰā§āϏāĻžāϰ āϏāĻžāϰā§āĻāĻžāϰāĻā§ āϧā§āϰ āĻāϰ⧠āĻĻāĻŋāĻā§āĻā§ āύāĻž, āĻāϰ āĻā§āύāĻāĻŋāϰāĻ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŋāϞ āύāĻžāĨ¤ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āϏāĻŽāϝāĻŧ 200ms āĻĨā§āĻā§ āĻāĻŽāĻŋāϝāĻŧā§ 40-30ms āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āĻāĻŦāĻ āĻāĻŽāĻŋ āĻāĻāĻŽāĻžāϤā§āϰ āϏāĻ āĻŋāĻ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ⧠āĻāϏā§āĻāĻŋāĨ¤
Tcp-āĻ āĻŦāϰā§āϤāĻŽāĻžāύ āϏāĻžāϰā§āĻāĻžāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĻāĻŋ āĻĢā§āϞ⧠āĻĻāĻŋāύ āĻāĻŦāĻ Http-āĻāϰ āĻ āϧā§āύ⧠āϏāĻŦāĻāĻŋāĻā§ āĻĒā§āύāϰāĻžāϝāĻŧ āϞāĻŋāĻā§āύāĨ¤ āĻāĻāύ āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āĻĄāĻŋāĻāĻžāĻāύā§āϰ āĻĒāϰā§āϝāĻžāϝāĻŧā§ āϰāϝāĻŧā§āĻā§, āϤāĻŦā§ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋāϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāĻŋāύā§āύ āύā§āϤāĻŋ āĻ āύā§āϏāĻžāϰā§āĨ¤ āĻĄāĻŋāĻāĻžāĻāϏ āĻāĻŦāĻ āϏāĻžāĻāĻā§āϰ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒ āϏāĻŋāĻā§āĻā§āϰā§āύāĻžāĻāĻ āĻāĻŦāĻ āĻĄāĻŋāĻŦāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϧāĻžāϰāĻŖāĻž āϰāϝāĻŧā§āĻā§, āĻāĻāĻŽāĻžāϤā§āϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āϝ⧠āĻĄāĻŋāĻāĻžāĻāϏāĻā§āϞāĻŋāϰ āĻāĻāĻāĻāĻŋāĻāĻŽāĻāϞ āĻĒā§āώā§āĻ āĻžāĻā§āϞāĻŋ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ⧎
āĻāĻĒāϏāĻāĻšāĻžāϰ
"āĻĢā§āϰā§āĻĄ āύāĻž āĻā§āύā§, āĻāϞ⧠āĻŽāĻžāĻĨāĻž āĻ ā§āĻāĻŦā§āύ āύāĻž" āĻāĻŽāĻŋ āĻŽāύ⧠āĻāϰāĻŋ, āĻāĻžāĻ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§, āĻāĻŽāĻžāϰ āϞāĻā§āώā§āϝ āĻāĻŦāĻ āĻāĻĻā§āĻĻā§āĻļā§āϝāĻā§āϞāĻŋ āĻāϰāĻ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻāĻāĻŋāϤ āĻāĻŋāϞ, āϏā§āĻāϏāĻžāĻĨā§ āĻŦāĻŋāĻāĻŋāύā§āύ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻāĻĻā§āϰ āĻāĻĒāϰ āϤāĻžāĻĻā§āϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻāĻŦāĻ āĻĒāĻĻā§āϧāϤāĻŋāĻā§āϞāĻŋ āĻ āϧā§āϝāϝāĻŧāύ āĻāϰāĻž āĻāĻāĻŋāϤ āĻāĻŋāϞāĨ¤ āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āϏāĻŽāĻžāĻĒā§āϤāĻŋāϰ āĻāĻžāĻāĻžāĻāĻžāĻāĻŋ, āĻāĻŋāύā§āϤ⧠āĻāĻŽāĻŋ āĻāĻŦāĻžāϰ āĻāĻŋāĻā§ āĻāĻŋāύāĻŋāϏ āĻā§āĻāĻžāĻŦā§ āĻāĻžāϰāĻžāĻĒ āĻāϰā§āĻāĻŋ āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĢāĻŋāϰ⧠āĻāϏāĻŦāĨ¤ āĻāύā§āύāϝāĻŧāύ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϞāĻžāĻāĻžāϞā§āύ āĻāĻŽāĻŋ āĻ āύā§āĻ āĻāĻŋāĻā§ āĻļāĻŋāĻā§āĻāĻŋ, āϤāĻŦā§ āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻāϰāĻ āĻ āύā§āĻ āĻāĻŋāĻā§ āĻļā§āĻāĻžāϰ āĻāĻā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻ āĻĒāϰā§āϝāύā§āϤ āĻĒāĻĄāĻŧā§ āĻĨāĻžāĻā§āύ, āϤāĻžāĻšāϞ⧠āĻĒāĻĄāĻŧāĻžāϰ āĻāύā§āϝ āϧāύā§āϝāĻŦāĻžāĻĻāĨ¤
āĻāϤā§āϏ: www.habr.com

