Advertisement
sycam_inc

Autoit HTTP webserver (no fin)

Aug 22nd, 2013
484
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 10.39 KB | None | 0 0
  1. #Region
  2. #AutoIt3Wrapper_Version=Beta
  3. #AutoIt3Wrapper_UseUpx=n
  4. #AutoIt3Wrapper_Change2CUI=y
  5. #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
  6. #AutoIt3Wrapper_Run_AU3Check=y
  7. #EndRegion
  8.  
  9. Opt("TrayMenuMode", 1)
  10.  
  11. #include <Misc.au3>
  12. #include <file.au3>
  13. #include <Array.au3>
  14. Local $Dlog = @ScriptDir & "\Logs\NetuX_log_" & @MDAY & "_" & @MON & "_" & @YEAR & ".log"
  15. Local $autoit = @AutoItExe
  16.  
  17. Local $intcfg = @ScriptDir & "\CFG\init.ini"
  18. Local $CGIcfg = @ScriptDir & "\CFG\CGI.ini"
  19.  
  20. Local $sRootDir = @ScriptDir & "\" & IniRead($intcfg, "Main", "MD", "Webroot")
  21. EnvSet("DOCUMENT_ROOT", $sRootDir)
  22. Local $sIP = @IPAddress1
  23. if IniRead($intcfg, "Main", "Uselocal", "false") = "true" Then
  24.     $sIP = "127.0.0.1"
  25. EndIf
  26. Local $iPort = 80
  27. Local $sServerAddress = "http://" & $sIP & "/"
  28. Local $sServerName = "NetuX/1.3 (" & @OSVersion & ") AutoIt " & @AutoItVersion
  29.  
  30. Local $aSocket[1]
  31. Local $sBuffer[1]
  32.  
  33. TCPStartup()
  34.  
  35. $iMainSocket = TCPListen($sIP, $iPort)
  36. If @error Then
  37.     MsgBox(266256, "NetuX 1.3", "Error : NetuX cannot establish a listening port check to see of any other" & @CRLF & "server software is running", 0)
  38.     _log("Error : Unknown Host Exeption, Exiting")
  39.     Exit
  40. EndIf
  41.  
  42. ConsoleWrite("Server established on : " & $sServerAddress & @CRLF)
  43. _log("established server : " & $sServerAddress)
  44. $exit = TrayCreateItem("Exit NetuX Server")
  45. While 1
  46.     if TrayGetMsg() = $exit Then _exit()
  47.     $iNewSocket = TCPAccept($iMainSocket)
  48.    
  49.     If $iNewSocket >= 0 Then
  50.         Local $user = UBound($aSocket)
  51.         ReDim $aSocket[$user + 1]
  52.         ReDim $sBuffer[$user + 1]
  53.         $aSocket[$user] = $iNewSocket
  54.         ConsoleWrite("New Client : " & TCPSocketToIP($iNewSocket) & @CRLF)
  55.         _log("Client connected on : " & TCPSocketToIP($iNewSocket))
  56.     EndIf
  57.     For $x = 0 to UBound($aSocket) - 1
  58.         $sNewData = TCPRecv($aSocket[$x], 1024)
  59.         If $sNewData Then
  60.             $sBuffer[$x] &= $sNewData
  61.             If StringInStr(StringStripCR($sBuffer[$x]), @LF & @LF) Then
  62.                 $sFirstLine = StringLeft($sBuffer[$x], StringInStr($sBuffer[$x], @LF))
  63.                 $sRequestType = StringLeft($sFirstLine, StringInStr($sFirstLine, " ") - 1)
  64.                 If $sRequestType = "GET" Then
  65.                     $sRequest = StringTrimRight(StringTrimLeft($sFirstLine, 4), 11)
  66.                     If StringInStr(StringReplace($sRequest, "\", "/"), "/.") Then
  67.                         _HTTP_Send400($aSocket[$x])
  68.                         ConsoleWrite("Client requested bad address" & @CRLF)
  69.                         _log("Error : code 400 requested bad address")
  70.                     Else
  71.                         If $sRequest = "/" Then
  72.                             if FileExists($sRootDir & IniRead($intcfg, "Main", "Mainfile", "\index.html")) Then
  73.                                 $sRequest = IniRead($intcfg, "Main", "Mainfile", "\index.html")
  74.                             Else
  75.                                 _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>")
  76.                             EndIf
  77.                         EndIf
  78.                        
  79.                         $sRequest = StringReplace($sRequest, "/", "\")
  80.                         If FileExists($sRootDir & "\" & $sRequest) Then
  81.                             $sFileType = StringRight($sRequest, 4)
  82.                             Switch $sFileType
  83.                                 Case "html", ".htm"
  84.                                     _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "text/html")
  85.                                 Case ".css"
  86.                                     _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "text/css")
  87.                                 Case ".jpg", "jpeg"
  88.                                     _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "image/jpeg")
  89.                                 Case ".png"
  90.                                     _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "image/png")
  91.                                 Case Else
  92.                                     if _isCGIscript($sFileType) Then
  93.                                         _autodetectscript($sRequest, $aSocket[$x], $sNewData)
  94.                                     Else
  95.                                         _HTTP_SendFile($aSocket[$x], $sRootDir & $sRequest, "application/octet-stream")
  96.                                     EndIf
  97.                             EndSwitch
  98.                         Else
  99.                             _autodetectscript($sRequest, $aSocket[$x], $sNewData)
  100.                         EndIf
  101.                     EndIf
  102.                 ElseIf $sRequestType = "POST" Then
  103.                     $daz = StringTrimLeft($sFirstLine, 5)
  104.                     $rem = StringSplit($daz, " ")
  105.                     $aPOST = StringTrimLeft($sBuffer[$x], StringInStr($sBuffer[$x], "-Length:"))
  106.                     $iPOST = StringSplit($aPOST, @CR)
  107.                     $POST = StringReplace($aPOST, $iPOST[1] & @CRLF & @CRLF, "")
  108.                     $cl = StringSplit(StringReplace($aPOST, "Length:", ""), @CRLF & @CRLF)
  109.                     $request = StringReplace($daz, " " & $rem[$rem[0]], "")
  110.                     $fullreq = $sBuffer[$x]
  111.                     if Stringleft($request, 2) = "\?" Then
  112.                         $request = IniRead($intcfg, "Main", "Mainfile", "\index.html") & StringTrimLeft($request, 1)
  113.                     EndIf
  114.                     $req = StringReplace($fullreq, @CR, "")
  115.                     $lines = StringSplit($req, @lf)
  116.                     $snp = StringSplit($request, "?")
  117.                     If FileExists($sRootDir & $snp[1]) Then
  118.                         _ArrayAdd($snp, "")
  119.                         EnvSet("QUERY_STRING", $snp[2])
  120.                         EnvSet("CONTENT_LENGTH", Number($cl[1]))
  121.                         EnvSet("SCRIPT_NAME", $snp[1])
  122.                         EnvSet("HTTP_USER_AGENT", StringTrimLeft($lines[3], 12))
  123.                         EnvSet("REQUEST_METHOD", StringLeft($fullreq, 4))
  124.                         EnvSet("REMOTE_HOST", TCPSocketToIp($aSocket[$x]))
  125.                         $ipid = Run(_CGIgetexe($snp[1]) & ' "' & $sRootDir & $snp[1] & '"', '', '', 0x8 + 0x01)
  126.                         Local $data
  127.                         StdinWrite($ipid, $POST)
  128.                         while ProcessExists($ipid)
  129.                             Sleep(100)
  130.                         wend
  131.                         $data = StdoutRead($ipid)
  132.                         Sleep(100)
  133.                         _HTTP_SendHtml($aSocket[$x], $data)
  134.                     Else
  135.                         _HTTP_Send404($aSocket[$x])
  136.                     EndIf
  137.                 EndIf
  138.                
  139.                 $sBuffer[$x] = ""
  140.                 $aSocket[$x] = -1
  141.                
  142.             EndIf
  143.         EndIf
  144.     Next
  145.    
  146.     Sleep(10)
  147. WEnd
  148.  
  149. Func _HTTP_ConvertString(ByRef $sInput)
  150.     $sInput = StringReplace($sInput, '+', ' ')
  151.     StringReplace($sInput, '%', '')
  152.     For $t = 0 To @extended
  153.         $Find_Char = StringLeft(StringTrimLeft($sInput, StringInStr($sInput, '%')), 2)
  154.         $sInput = StringReplace($sInput, '%' & $Find_Char, Chr(Dec($Find_Char)))
  155.     Next
  156. EndFunc
  157.  
  158. Func _HTTP_SendHTML($hSocket, $sHTML, $sReply = "200 OK")
  159.     _HTTP_SendData($hSocket, Binary($sHTML), "text/html", $sReply)
  160. EndFunc
  161.  
  162. Func _HTTP_SendFile($hSocket, $sFileLoc, $sMimeType, $sReply = "200 OK")
  163.     Local $hFile, $sImgBuffer, $sPacket, $a
  164.    
  165.     ConsoleWrite("Sending " & $sFileLoc & @CRLF)
  166.    
  167.     $hFile = FileOpen($sFileLoc, 16)
  168.     $bFileData = FileRead($hFile)
  169.     FileClose($hFile)
  170.    
  171.     _HTTP_SendData($hSocket, $bFileData, $sMimeType, $sReply)
  172. EndFunc
  173.  
  174. Func _HTTP_SendData($hSocket, $bData, $sMimeType, $sReply = "200 OK")
  175.     $sPacket = Binary("HTTP/1.1 " & $sReply & @CRLF & _
  176.             "Server: " & $sServerName & @CRLF & _
  177.             "Connection: close" & @CRLF & _
  178.             "Content-Lenght: " & BinaryLen($bData) & @CRLF & _
  179.             "Content-Type: " & $sMimeType & @CRLF & _
  180.             @CRLF)
  181.     TCPSend($hSocket, $sPacket)
  182.    
  183.     While BinaryLen($bData)
  184.         $a = TCPSend($hSocket, $bData)
  185.         $bData = BinaryMid($bData, $a + 1, BinaryLen($bData) - $a)
  186.     WEnd
  187.    
  188.     $sPacket = Binary(@CRLF & @CRLF)
  189.     TCPSend($hSocket, $sPacket)
  190.    
  191.     TCPCloseSocket($hSocket)
  192. EndFunc
  193.  
  194. Func _HTTP_Send404($hSocket)
  195.     Local $s404Loc = $sRootDir & "\404.html"
  196.     If FileExists($s404Loc) Then
  197.         _HTTP_SendFile($hSocket, $s404Loc, "text/html")
  198.     Else
  199.         _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")
  200.     EndIf
  201. EndFunc
  202.  
  203. Func _HTTP_Send400($hSocket)
  204.     Local $s400Loc = $sRootDir & "\400.html"
  205.     If FileExists($s400Loc) Then
  206.         _HTTP_SendFile($hSocket, $s400Loc, "text/html")
  207.     Else
  208.         _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")
  209.     EndIf
  210. EndFunc
  211.  
  212. Func _HTTP_GetPost($s_Buffer)
  213.     Local $sTempPost, $sLen, $sPostData, $sTemp
  214.    
  215.     $sTempPost = StringTrimLeft($s_Buffer, StringInStr($s_Buffer, "Content-Length:"))
  216.     $sLen = StringTrimLeft($sTempPost, StringInStr($sTempPost, ": "))
  217.    
  218.     $sPostData = StringSplit(StringRight($s_Buffer, $sLen), "&")
  219.    
  220.     Local $sReturn[$sPostData[0] + 1][2]
  221.    
  222.     For $t = 1 To $sPostData[0]
  223.         $sTemp = StringSplit($sPostData[$t], "=")
  224.         If $sTemp[0] >= 2 Then
  225.             $sReturn[$t][0] = $sTemp[1]
  226.             $sReturn[$t][1] = $sTemp[2]
  227.         EndIf
  228.     Next
  229.    
  230.     Return $sReturn
  231. EndFunc
  232.  
  233. Func _HTTP_Post($sName, $sArray)
  234.     For $i = 1 to UBound($sArray) - 1
  235.         If $sArray[$i][0] = $sName Then
  236.             Return $sArray[$i][1]
  237.         EndIf
  238.     Next
  239.     Return ""
  240. EndFunc
  241.  
  242. Func _log($text)
  243.     if IniRead($intcfg, "Main", "log", "true") = "true" Then
  244.         local $ilog = FileOpen($Dlog, 1)
  245.         FileWrite($ilog, @HOUR & ":" & @MIN & ":" & @SEC & ":" & $text & @CRLF)
  246.     EndIf
  247. EndFunc
  248.  
  249. Func TCPSocketToIP($SHOCKET)
  250.     Local $sockaddr, $aRet
  251.    
  252.     $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
  253.    
  254.     $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
  255.             "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
  256.     If Not @error And $aRet[0] = 0 Then
  257.         $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
  258.         If Not @error Then $aRet = $aRet[0]
  259.     Else
  260.         $aRet = 0
  261.     EndIf
  262.    
  263.     $sockaddr = 0
  264.    
  265.     Return $aRet
  266. EndFunc
  267.  
  268. Func _autodetectscript($request, $hSocket, $fullreq)
  269.     if Stringleft($request, 2) = "\?" Then
  270.         $request = IniRead($intcfg, "Main", "Mainfile", "\index.html") & StringTrimLeft($request, 1)
  271.     EndIf
  272.     $req = StringReplace($fullreq, @CR, "")
  273.     $lines = StringSplit($req, @lf)
  274.     $snp = StringSplit($request, "?")
  275.     If FileExists($sRootDir & $snp[1]) Then
  276.         _ArrayAdd($snp, "")
  277.         EnvSet("QUERY_STRING", $snp[2])
  278.         EnvSet("SCRIPT_NAME", $snp[1])
  279.         EnvSet("HTTP_USER_AGENT", StringTrimLeft($lines[3], 12))
  280.         EnvSet("REQUEST_METHOD", StringLeft($fullreq, 4))
  281.         EnvSet("REMOTE_HOST", TCPSocketToIp($hSocket))
  282.         $ipid = Run(_CGIgetexe($snp[1]) & ' "' & $sRootDir & $snp[1] & '"', '', '', 0x8 + 0x01)
  283.         Local $data
  284.         StdinWrite($ipid, "hello")
  285.         while ProcessExists($ipid)
  286.             Sleep(100)
  287.         wend
  288.         $data = StdoutRead($ipid)
  289.         Sleep(100)
  290.         _HTTP_SendHtml($hSocket, $data)
  291.     Else
  292.         _HTTP_Send404($hSocket)
  293.     EndIf
  294. EndFunc
  295.  
  296. Func _exit()
  297.     _log("Server Closed")
  298.     Exit
  299. EndFunc
  300.  
  301. Func _isCGIscript($file)
  302.     $cgidet = IniRead($CGIcfg, "Main", "CGI.bindExt", "")
  303.     $aCFG = StringSplit($cgidet, ",")
  304.     for $i = 1 to $aCFG[0]
  305.         $str = StringSplit($aCFG[$i], ">")
  306.         if _filegetext($file) = $str[1] Then
  307.             Return True
  308.         EndIf
  309.     Next
  310.     Return False
  311. EndFunc
  312.  
  313. Func _CGIgetexe($file)
  314.     $cgidet = IniRead($CGIcfg, "Main", "CGI.bindExt", "")
  315.     $aCFG = StringSplit($cgidet, ",")
  316.     for $i = 1 to $aCFG[0]
  317.         $str = StringSplit($aCFG[$i], ">")
  318.         if _filegetext($file) = $str[1] Then
  319.             _ArrayAdd($str, "")
  320.             Return $str[2]
  321.         EndIf
  322.     Next
  323. EndFunc
  324.  
  325. Func _filegetext($sString)
  326.     $aString = StringSplit($sString, ".")
  327.     Return $aString[$aString[0]]
  328. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement