Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Region
- #AutoIt3Wrapper_Version=Beta
- #AutoIt3Wrapper_UseUpx=n
- #AutoIt3Wrapper_Change2CUI=y
- #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
- #AutoIt3Wrapper_Run_AU3Check=y
- #EndRegion
- Opt("TrayMenuMode", 1)
- #include <Misc.au3>
- #include <file.au3>
- #include <Array.au3>
- Local $Dlog = @ScriptDir & "\Logs\NetuX_log_" & @MDAY & "_" & @MON & "_" & @YEAR & ".log"
- Local $autoit = @AutoItExe
- Local $intcfg = @ScriptDir & "\CFG\init.ini"
- Local $CGIcfg = @ScriptDir & "\CFG\CGI.ini"
- Local $sRootDir = @ScriptDir & "\" & IniRead($intcfg, "Main", "MD", "Webroot")
- EnvSet("DOCUMENT_ROOT", $sRootDir)
- Local $sIP = @IPAddress1
- if IniRead($intcfg, "Main", "Uselocal", "false") = "true" Then
- $sIP = "127.0.0.1"
- EndIf
- Local $iPort = 80
- Local $sServerAddress = "http://" & $sIP & "/"
- Local $sServerName = "NetuX/1.3 (" & @OSVersion & ") AutoIt " & @AutoItVersion
- Local $aSocket[1]
- Local $sBuffer[1]
- TCPStartup()
- $iMainSocket = TCPListen($sIP, $iPort)
- If @error Then
- MsgBox(266256, "NetuX 1.3", "Error : NetuX cannot establish a listening port check to see of any other" & @CRLF & "server software is running", 0)
- _log("Error : Unknown Host Exeption, Exiting")
- Exit
- EndIf
- ConsoleWrite("Server established on : " & $sServerAddress & @CRLF)
- _log("established server : " & $sServerAddress)
- $exit = TrayCreateItem("Exit NetuX Server")
- While 1
- if TrayGetMsg() = $exit Then _exit()
- $iNewSocket = TCPAccept($iMainSocket)
- If $iNewSocket >= 0 Then
- Local $user = UBound($aSocket)
- ReDim $aSocket[$user + 1]
- ReDim $sBuffer[$user + 1]
- $aSocket[$user] = $iNewSocket
- ConsoleWrite("New Client : " & TCPSocketToIP($iNewSocket) & @CRLF)
- _log("Client connected on : " & TCPSocketToIP($iNewSocket))
- EndIf
- For $x = 0 to UBound($aSocket) - 1
- $sNewData = TCPRecv($aSocket[$x], 1024)
- If $sNewData Then
- $sBuffer[$x] &= $sNewData
- If StringInStr(StringStripCR($sBuffer[$x]), @LF & @LF) Then
- $sFirstLine = StringLeft($sBuffer[$x], StringInStr($sBuffer[$x], @LF))
- $sRequestType = StringLeft($sFirstLine, StringInStr($sFirstLine, " ") - 1)
- If $sRequestType = "GET" Then
- $sRequest = StringTrimRight(StringTrimLeft($sFirstLine, 4), 11)
- If StringInStr(StringReplace($sRequest, "\", "/"), "/.") Then
- _HTTP_Send400($aSocket[$x])
- ConsoleWrite("Client requested bad address" & @CRLF)
- _log("Error : code 400 requested bad address")
- Else
- If $sRequest = "/" Then
- if FileExists($sRootDir & IniRead($intcfg, "Main", "Mainfile", "\index.html")) Then
- $sRequest = IniRead($intcfg, "Main", "Mainfile", "\index.html")
- Else
- _HTTP_SendHTML($aSocket[$x], "<h1>Config Error</h1><br/>If you are seeing this page it means their is no mainfile specified in the config. contact the server adminstrator<br/><br/><i>Netux SND HTTP Server version 1.3</i>")
- EndIf
- EndIf
- $sRequest = StringReplace($sRequest, "/", "\")
- If FileExists($sRootDir & "\" & $sRequest) Then
- $sFileType = StringRight($sRequest, 4)
- Switch $sFileType
- Case "html", ".htm"
- _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "text/html")
- Case ".css"
- _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "text/css")
- Case ".jpg", "jpeg"
- _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "image/jpeg")
- Case ".png"
- _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "image/png")
- Case Else
- if _isCGIscript($sFileType) Then
- _autodetectscript($sRequest, $aSocket[$x], $sNewData)
- Else
- _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "application/octet-stream")
- EndIf
- EndSwitch
- Else
- _autodetectscript($sRequest, $aSocket[$x], $sNewData)
- EndIf
- EndIf
- ElseIf $sRequestType = "POST" Then
- $daz = StringTrimLeft($sFirstLine, 5)
- $rem = StringSplit($daz, " ")
- $aPOST = StringTrimLeft($sBuffer[$x], StringInStr($sBuffer[$x], "-Length:"))
- $iPOST = StringSplit($aPOST, @CR)
- $POST = StringReplace($aPOST, $iPOST[1] & @CRLF & @CRLF, "")
- $cl = StringSplit(StringReplace($aPOST, "Length:", ""), @CRLF & @CRLF)
- $request = StringReplace($daz, " " & $rem[$rem[0]], "")
- $fullreq = $sBuffer[$x]
- if Stringleft($request, 2) = "\?" Then
- $request = IniRead($intcfg, "Main", "Mainfile", "\index.html") & StringTrimLeft($request, 1)
- EndIf
- $req = StringReplace($fullreq, @CR, "")
- $lines = StringSplit($req, @lf)
- $snp = StringSplit($request, "?")
- If FileExists($sRootDir & $snp[1]) Then
- _ArrayAdd($snp, "")
- EnvSet("QUERY_STRING", $snp[2])
- EnvSet("CONTENT_LENGTH", Number($cl[1]))
- EnvSet("SCRIPT_NAME", $snp[1])
- EnvSet("HTTP_USER_AGENT", StringTrimLeft($lines[3], 12))
- EnvSet("REQUEST_METHOD", StringLeft($fullreq, 4))
- EnvSet("REMOTE_HOST", TCPSocketToIp($aSocket[$x]))
- $ipid = Run(_CGIgetexe($snp[1]) & ' "' & $sRootDir & $snp[1] & '"', '', '', 0x8 + 0x01)
- Local $data
- StdinWrite($ipid, $POST)
- while ProcessExists($ipid)
- Sleep(100)
- wend
- $data = StdoutRead($ipid)
- Sleep(100)
- _HTTP_SendHtml($aSocket[$x], $data)
- Else
- _HTTP_Send404($aSocket[$x])
- EndIf
- EndIf
- $sBuffer[$x] = ""
- $aSocket[$x] = -1
- EndIf
- EndIf
- Next
- Sleep(10)
- WEnd
- Func _HTTP_ConvertString(ByRef $sInput)
- $sInput = StringReplace($sInput, '+', ' ')
- StringReplace($sInput, '%', '')
- For $t = 0 To @extended
- $Find_Char = StringLeft(StringTrimLeft($sInput, StringInStr($sInput, '%')), 2)
- $sInput = StringReplace($sInput, '%' & $Find_Char, Chr(Dec($Find_Char)))
- Next
- EndFunc
- Func _HTTP_SendHTML($hSocket, $sHTML, $sReply = "200 OK")
- _HTTP_SendData($hSocket, Binary($sHTML), "text/html", $sReply)
- EndFunc
- Func _HTTP_SendFile($hSocket, $sFileLoc, $sMimeType, $sReply = "200 OK")
- Local $hFile, $sImgBuffer, $sPacket, $a
- ConsoleWrite("Sending " & $sFileLoc & @CRLF)
- $hFile = FileOpen($sFileLoc, 16)
- $bFileData = FileRead($hFile)
- FileClose($hFile)
- _HTTP_SendData($hSocket, $bFileData, $sMimeType, $sReply)
- EndFunc
- Func _HTTP_SendData($hSocket, $bData, $sMimeType, $sReply = "200 OK")
- $sPacket = Binary("HTTP/1.1 " & $sReply & @CRLF & _
- "Server: " & $sServerName & @CRLF & _
- "Connection: close" & @CRLF & _
- "Content-Lenght: " & BinaryLen($bData) & @CRLF & _
- "Content-Type: " & $sMimeType & @CRLF & _
- @CRLF)
- TCPSend($hSocket, $sPacket)
- While BinaryLen($bData)
- $a = TCPSend($hSocket, $bData)
- $bData = BinaryMid($bData, $a + 1, BinaryLen($bData) - $a)
- WEnd
- $sPacket = Binary(@CRLF & @CRLF)
- TCPSend($hSocket, $sPacket)
- TCPCloseSocket($hSocket)
- EndFunc
- Func _HTTP_Send404($hSocket)
- Local $s404Loc = $sRootDir & "\404.html"
- If FileExists($s404Loc) Then
- _HTTP_SendFile($hSocket, $s404Loc, "text/html")
- Else
- _HTTP_SendHTML($hSocket, "<h1>404 Error:</h1><br/>The file you requested could not be found.<br/><br/><i>Netux SND HTTP Server version 1.3</i>", "404 not found")
- EndIf
- EndFunc
- Func _HTTP_Send400($hSocket)
- Local $s400Loc = $sRootDir & "\400.html"
- If FileExists($s400Loc) Then
- _HTTP_SendFile($hSocket, $s400Loc, "text/html")
- Else
- _HTTP_SendHTML($hSocket, "<h1>400 Error:</h1><br/>bad or incorrect syntax in address.<br/><br/><i>Netux SND HTTP Server version 1.3</i>", "400 bad")
- EndIf
- EndFunc
- Func _HTTP_GetPost($s_Buffer)
- Local $sTempPost, $sLen, $sPostData, $sTemp
- $sTempPost = StringTrimLeft($s_Buffer, StringInStr($s_Buffer, "Content-Length:"))
- $sLen = StringTrimLeft($sTempPost, StringInStr($sTempPost, ": "))
- $sPostData = StringSplit(StringRight($s_Buffer, $sLen), "&")
- Local $sReturn[$sPostData[0] + 1][2]
- For $t = 1 To $sPostData[0]
- $sTemp = StringSplit($sPostData[$t], "=")
- If $sTemp[0] >= 2 Then
- $sReturn[$t][0] = $sTemp[1]
- $sReturn[$t][1] = $sTemp[2]
- EndIf
- Next
- Return $sReturn
- EndFunc
- Func _HTTP_Post($sName, $sArray)
- For $i = 1 to UBound($sArray) - 1
- If $sArray[$i][0] = $sName Then
- Return $sArray[$i][1]
- EndIf
- Next
- Return ""
- EndFunc
- Func _log($text)
- if IniRead($intcfg, "Main", "log", "true") = "true" Then
- local $ilog = FileOpen($Dlog, 1)
- FileWrite($ilog, @HOUR & ":" & @MIN & ":" & @SEC & ":" & $text & @CRLF)
- EndIf
- EndFunc
- Func TCPSocketToIP($SHOCKET)
- Local $sockaddr, $aRet
- $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
- $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
- "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
- If Not @error And $aRet[0] = 0 Then
- $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
- If Not @error Then $aRet = $aRet[0]
- Else
- $aRet = 0
- EndIf
- $sockaddr = 0
- Return $aRet
- EndFunc
- Func _autodetectscript($request, $hSocket, $fullreq)
- if Stringleft($request, 2) = "\?" Then
- $request = IniRead($intcfg, "Main", "Mainfile", "\index.html") & StringTrimLeft($request, 1)
- EndIf
- $req = StringReplace($fullreq, @CR, "")
- $lines = StringSplit($req, @lf)
- $snp = StringSplit($request, "?")
- If FileExists($sRootDir & $snp[1]) Then
- _ArrayAdd($snp, "")
- EnvSet("QUERY_STRING", $snp[2])
- EnvSet("SCRIPT_NAME", $snp[1])
- EnvSet("HTTP_USER_AGENT", StringTrimLeft($lines[3], 12))
- EnvSet("REQUEST_METHOD", StringLeft($fullreq, 4))
- EnvSet("REMOTE_HOST", TCPSocketToIp($hSocket))
- $ipid = Run(_CGIgetexe($snp[1]) & ' "' & $sRootDir & $snp[1] & '"', '', '', 0x8 + 0x01)
- Local $data
- StdinWrite($ipid, "hello")
- while ProcessExists($ipid)
- Sleep(100)
- wend
- $data = StdoutRead($ipid)
- Sleep(100)
- _HTTP_SendHtml($hSocket, $data)
- Else
- _HTTP_Send404($hSocket)
- EndIf
- EndFunc
- Func _exit()
- _log("Server Closed")
- Exit
- EndFunc
- Func _isCGIscript($file)
- $cgidet = IniRead($CGIcfg, "Main", "CGI.bindExt", "")
- $aCFG = StringSplit($cgidet, ",")
- for $i = 1 to $aCFG[0]
- $str = StringSplit($aCFG[$i], ">")
- if _filegetext($file) = $str[1] Then
- Return True
- EndIf
- Next
- Return False
- EndFunc
- Func _CGIgetexe($file)
- $cgidet = IniRead($CGIcfg, "Main", "CGI.bindExt", "")
- $aCFG = StringSplit($cgidet, ",")
- for $i = 1 to $aCFG[0]
- $str = StringSplit($aCFG[$i], ">")
- if _filegetext($file) = $str[1] Then
- _ArrayAdd($str, "")
- Return $str[2]
- EndIf
- Next
- EndFunc
- Func _filegetext($sString)
- $aString = StringSplit($sString, ".")
- Return $aString[$aString[0]]
- EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement