Пример
Консольное приложение
Скомпилируйте данный пример через AutoIt3 Wrapper и запустите.
Сервер будет открыт на всех IP адресах компьютера на порте 8081. Для завершения работы сервера, нажмите клавишу F1.
#Notrayicon #Region #AutoIt3Wrapper_OutFile=Console.exe #AutoIt3Wrapper_UseX64=N #AutoIt3Wrapper_Compile_both=N #AutoIt3Wrapper_Compression=4 #AutoIt3Wrapper_Change2CUI=Y #AutoIt3Wrapper_Res_Comment=HTTP SC Console Server (пример) #AutoIt3Wrapper_Res_Description=HTTP SC Console Server (пример) #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_FileVersion_AutoIncrement=N #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_LegalCopyright=Astel064 #AutoIt3Wrapper_res_requestedExecutionLevel=None #AutoIt3Wrapper_res_Compatibility=Vista,Windows7 #AutoIt3Wrapper_Res_SaveSource=Y #EndRegion #include "Http SC.inc" #include "Http SC Error.inc" #include "GelAllIp.au3" ; Объявляем пемеременные Local $aServer; Здесь будут храниться данные сервера Local $aBanList; Здесь будет храниться информация о блокировке клиентов Local $vIP; Здесь будет размещен массив с IP адесами компьютера Local $iPort = 8081; Порт сервера Local $sLogFile = @ScriptDir&"\Http SC.log"; Лог файл сервера Local $sContentFolder = @ScriptDir; Домашняя папка сервера Local $sLogin = "User"; Логин при авторизации Local $sPassword = "123"; Пароль при авторизации Local $aServerIp, $i, $fWhile, $hTimer, $aAuthenticateData ; Выводим информацию ConsoleWrite("HTTP SC v1.0 (11/10/2017 17:48)"&@CRLF) ConsoleWrite("Port: "&$iPort&@CRLF) ConsoleWrite("Press F1 to Exit..."&@CRLF&@CRLF&@CRLF) Sleep(2500) ; Получаем список IP адесов компьютер в виде массива $vIP = _GelAllIp(1) If @Error Then $vIP = "127.0.0.1"; Если не получилось получить список IP адесов, то сервер будет принемать подключения только по адресу: 127.0.0.1 ; Создаем сервер ConsoleWrite("Create server..."&@CRLF) $aServer = _HttpSC_CreateServer($aBanList, $vIP, $iPort, "HTTP SC v1.0", 0, $sLogFile) If @Error Then MsgBox(0+16, "Http SC", "Не удалось создать сервер!"&@CRLF&_HttpSCError_ConvertError2Text(@Error, @Extended, 1)) Exit 1 EndIF ; Настраиваем сервер ConsoleWrite("Config server..."&@CRLF) _HttpSC_ConfigServer($aServer, 30, 30, 90) ; Запускаем сервер ConsoleWrite("Start server..."&@CRLF) _HttpSC_StartServer($aServer, $aBanList) If @Error Then MsgBox(0+16, "Http SC", "Не удалось запустить сервер!"&@CRLF&_HttpSCError_ConvertError2Text(@Error, @Extended, 1)) _HttpSC_DeleteServer($aServer, $aBanList) Exit 2 EndIF ; Вывод информации о открытых сокетах $aServerIp = _HttpSC_ServerGet_ServerSockets($aServer) If NOT @Error Then ConsoleWrite("Open sockets:"&@CRLF) For $i = 1 To $aServerIp[0][0] ConsoleWrite(" "&$aServerIp[$i][1]&" (IP: "&$aServerIp[$i][0]&")"&@CRLF) Next ConsoleWrite(@CRLF) EndIF ; Уведомляет о нажатии на клавишу F1 для выхода и настраивает выход ConsoleWrite("Press F1 to Exit..."&@CRLF&@CRLF) $fWhile = 1 HotKeySet("{F1}", "_Exit") Func _Exit() HotKeySet("{F1}") $fWhile = 0 ConsoleWrite("Wait exit..."&@CRLF) EndFunc ; Добавляет IP адрес 127.0.0.1 в белый список (пользователь не будет блокироваться) _HttpSC_WhileList_Add($aServer, "127.0.0.1") ; Обработчик сервера $hTimer = TimerInit(); Задает таймер для проверки IP адресов сервера и оптимизации данных сервера While $fWhile _HttpSC_ServerHandler($aServer, $aBanList, "_GetFunc", "_PostFunc", "_OtherFunc", "_UserBanFunc") If TimerDiff($hTimer) >= 60000 Then; Проверка каждую минуту ConsoleWrite("Optimization: "&_HttpSC_ServerOptimization($aServer, 0)&@CRLF) ConsoleWrite("CheckIp: "&_HttpSC_ServerCheckIp($aServer, _GelAllIp(1))&@CRLF) $hTimer = TimerInit() EndIF Sleep(10) Wend ; Останавливаем сервер ConsoleWrite("Stop server..."&@CRLF) _HttpSC_StopServer($aServer, $aBanList) ; Удаляем сервер ConsoleWrite("Delete server..."&@CRLF) _HttpSC_DeleteServer($aServer, $aBanList) ; Выход через 5 сек ConsoleWrite("Exit (wait 5 sec)..."&@CRLF) Sleep(5000) Exit 0 ; Функция, вызываемая в ответ на GET запрос Func _GetFunc($sUrl, $hUserSocket, $sUserIp, $sHttpVer, $sReqest) Local $sHost, $sUserAgent ; Преобразуем URL (Декодируем и переворачиваем URL слэши ""/" в Windows-подобные "\") $sUrl = __HttpSC_Encoding_URIDecode($sUrl) $sUrl = StringReplace($sUrl, "/", "\") ; Получаем хост и используемый клиентом агент (браузер) $sHost = _HttpSC_ReqestParse($sReqest, "Host") $sUserAgent = _HttpSC_ReqestParse($sReqest, "User-Agent") ConsoleWrite(" Client IP: "&$sUserIp&"; Agent: "&$sUserAgent&": GET "&$sHost&" "&$sUrl&@CRLF) If $sUrl = "\" Then $sUrl = "\index.htm"; Если клиент запрашивает домашнюю страницу, то отправляем ему страницу index.htm ; Выход, если запрошен файл exit.php If $sUrl = "\exit.php" Then _Exit() Return "" EndIF If FileExists($sContentFolder&$sUrl) Then ; Если запрашиваемый файл существует If $sUrl <> "\Authenticate.htm" Then ; Если запрошен файл, который не требует авторизации Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&$sUrl), "HTTP/1.1", "200 Ok", FileGetTime($sContentFolder&$sUrl), _HttpSC_FileGetMimeType($sUrl), "", "") Else ; Если запрошен файл, который требует авторизацию $aAuthenticateData = _HttpSC_BasicAuthenticate_GetData($sReqest) If @Error OR $aAuthenticateData[0] <> $sLogin OR $aAuthenticateData[1] <> $sPassword Then ; Если авторизация не пройдена Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&"\AuthenticateError.htm"), "HTTP/1.1", "401 Unauthorized", "", "text/html", "", "Authorization required!") Else ; Если авторизация пройдена Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&$sUrl), "HTTP/1.1", "200 Ok", FileGetTime($sContentFolder&$sUrl), _HttpSC_FileGetMimeType($sUrl), "", "") EndIF EndIF Else ; Если запрашиваемый файл НЕ существует Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&"\404.htm"), "HTTP/1.1", "404 Not Found", "", "text/html", "", "") EndIF EndFunc ; Функция, вызываемая в ответ на POST запрос Func _PostFunc($sUrl, $hUserSocket, $sUserIp, $sHttpVer, $sReqest) Local $sAnswer ; Преобразуем URL (Декодируем и переворачиваем URL слэши ""/" в Windows-подобные "\") $sUrl = __HttpSC_Encoding_URIDecode($sUrl) $sUrl = StringReplace($sUrl, "/", "\") ; Получаем хост и используемый клиентом агент (браузер) $sHost = _HttpSC_ReqestParse($sReqest, "Host") $sUserAgent = _HttpSC_ReqestParse($sReqest, "User-Agent") ConsoleWrite(" Client IP: "&$sUserIp&"; Agent: "&$sUserAgent&": POST "&$sHost&" "&$sUrl&@CRLF) If $sUrl = "\" Then $sUrl = "\index.htm"; Если клиент запрашивает домашнюю страницу, то отправляем ему страницу index.htm $sAnswer = '<head>'&@CRLF $sAnswer &= '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'&@CRLF $sAnswer &= '<title>HttpSC</title>'&@CRLF $sAnswer &= '</head>'&@CRLF $sAnswer &= ''&@CRLF $sAnswer &= '<p align="center"><font size="5"><b>HttpSC - POST</b></font></p>'&@CRLF $sAnswer &= '<p align="left"><font size="3">Состояние: Успех (POST)</font></p>'&@CRLF $sAnswer &= '<p align="left">Данные: '&_HttpSC_PostReqestGetData($sReqest, 0) &'</p>'&@CRLF $sAnswer &= '<p align="left"><a href="/">Главная</a></p>'&@CRLF Return _HttpSC_CreateAnswer($aServer, $sAnswer, "HTTP/1.1", "200 Ok", _HttpSC_ConvertLastModifiedTime(@YEAR&"/"&@MON&"/"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC), "text/html", "", "") EndFunc Func _OtherFunc($hUserSocket, $sUserIp, $Reqest) Return "" EndFunc Func _UserBanFunc($sUserIp, $sServerSocket, $sServerIp) ConsoleWrite("Ban Client IP: "&$sUserIp&@CRLF) Return "" EndFunc
|
См. также