HTTPd v3.0

By Spoofing on Oct 23, 2010

This is new version of web-server.

1) Hardcoded, but code is pretty and simple to change anything settings

2) Less dependent on the limit variables (first line - method, request, query, version saved as binary variables). No problem, if the variable limit is exceeded, - this mIRC's error and server returns "500 - Internal server error", but not stop working =)

3) Very-very-very faster.

http://83.143.33.145 - mIRC based web-server.
http://83.143.33.145/httpd.mrc - download.

alias htpacket {
  var %sock = $1, %packet = 16384 - $sock(%sock).sq
  if (%packet) {
    if ($hget(%sock,head,&head)) {
      bcopy -c &packet 1 &head 1 %packet
      if ($bvar(&packet,0) < $bvar(&head,0)) {
        bcopy -c &head 1 &head $calc($v1 + 1) -1
        hadd -b %sock head &head
      }
      else {
        hdel %sock head
      }
      dec %packet $bvar(&packet,0)
    }
  }
  if (%packet) {
    if ($hget(%sock,0) < $hget(%sock,-1)) {
      hinc %sock 0 %packet
      bread $hget(%sock,path) $v1 %packet &byte
    }
    elseif ($hget(%sock,write,&write)) {
      bcopy -c &byte 1 &write 1 %packet
      if ($bvar(&packet,0) < $bvar(&write,0)) {
        bcopy -c &write 1 &write $calc($v1 + 1) -1
        hadd -b %sock write &write
      }
      else {
        hdel %sock write
      }
    }
    if ($bvar(&byte,0)) {
      bcopy -c &packet $calc($bvar(&packet,0) + 1) &byte 1 -1
      dec %packet $v1
    }
  }
  if (%packet) {
    hadd %sock error $ticks
  }
  if ($bvar(&packet,0)) {
    sockwrite -b %sock $v1 &packet
  }
}
on *:START: {
  if ($hget(httpd)) hfree $v1 | hmake httpd | hinc httpd sock 0
  if ($sock(httpd)) sockclose $v1 | socklisten -d 0.0.0.0 httpd 80
}
on *:SOCKLISTEN:httpd: {
  hinc httpd sock
  sockaccept $+(httpd,/,$hget(httpd,sock))
  if ($sockerr) {
    var %sock = $+(httpd,/,$hget(httpd,sock))
    sockclose %sock
  }
  else {
    var %sock = $+(httpd,/,$hget(httpd,sock))
    hmake %sock
    hadd %sock sock $sockname
    hadd %sock ip $sock(%sock).ip
  }
}
on *:SOCKREAD:httpd/*: {
  :rq
  if ($sockerr) {
    hfree $sockname
    sockclose $sockname
  }
  elseif ($sock($sockname).rq > 0) {
    sockread 8192 $+(&,$sockname)
    bcopy &read $calc($hget($sockname,read,&read) + 1) $+(&,$sockname) 1 -1
    hadd -b $sockname read &read
    if ($bfind(&read,0,13 10 13 10)) {
      var %offset = $v1 + 4, %length = $bvar(&read,0) - %offset
      if ($bfind(&read,0,13 10)) {
        bcopy -c &request 1 &read 1 $calc($v1 - 1)
        if ($bfind(&request,0,32)) {
          bcopy -c &method 1 &request 1 $calc($v1 - 1)
          bcopy -c &request 1 &request $calc($v1 + 1) -1
          hadd -b $sockname method &method
        }
        if ($bfind(&request,0,32)) {
          bcopy -c &version 1 &request $calc($v1 + 1) -1
          bcopy -c &request 1 &request 1 $calc($v1 - 1)
          hadd -b $sockname version &version
        }
        if ($bfind(&request,0,63)) {
          bcopy -c &query 1 &request $calc($v1 + 1) -1
          bcopy -c &request 1 &request 1 $calc($v1 - 1)
          hadd -b $sockname query &query
        }
        hadd -b $sockname request &request
      }
      if ($hget($sockname,request,&request)) {
        var %i = 1, %length = $v1, %request
        while (%i <= %length) {
          var %chr = $bvar(&request,%i,1), %i = %i + 1
          if (%chr == 37) {
            var %chr = $base($bvar(&request,%i,2).text,16,10), %i = %i + 2
            if (%chr == 32) var %chr, %request = $+(%request,$(%20,))
          }
          elseif (%chr == 43) var %chr, %request = $+(%request,$(%20,))
          if (%chr == 47) {
            if ($nopath(%request) == .) var %request = $nofile(%request)
            if ($nopath(%request) == ..) var %request = $nofile($mid(%request,1,-3))
            if (*/ iswm %request) continue
            var %request = $+(%request,/)
          }
          elseif (%chr == 92) { }
          elseif (%chr) var %request = $+(%request,$chr($v1))
        }
      }
      if (%request) {
        var %request = $utfdecode($replace($v1,$(%20,),$chr(32))), %path = $+($mircdir,/,htdocs,/,%request)
        if ($isdir(%path)) {
          if (*/ iswm %request) {
            if ($isfile($+(%path,/,index.mhtml))) var %path = $+(%path,/,index.mhtml)
            elseif ($isfile($+(%path,/,index.html))) var %path = $+(%path,/,index.html)
            elseif ($isfile($+(%path,/,index.htm))) var %path = $+(%path,/,index.htm)
            elseif ($isfile($+(%path,/,default.html))) var %path = $+(%path,/,default.html)
            elseif ($isfile($+(%path,/,default.htm))) var %path = $+(%path,/,default.htm)
            else {
              var %i = 0, %window = $+(@,$sockname)
              window -h %window 0 0 0 0
              if ($finddir(%path,*,0,0,aline %window directory - - $nopath($1-))) var %i = %i + $v1
              if ($findfile(%path,*,0,0,aline %window file $lof($1-) $file($1-).mtime $nopath($1-))) var %i = %i + $v1
              filter -wwceut 1 32 %window %window
              bset -t &write $calc($bvar(&write,0) + 1) <!DOCTYPE html>
              bset -t &write $calc($bvar(&write,0) + 1) <html>
              bset -t &write $calc($bvar(&write,0) + 1) <head>
              bset -t &write $calc($bvar(&write,0) + 1) <title> $+ Index of %request $+ </title>
              bset -t &write $calc($bvar(&write,0) + 1) </head>
              bset -t &write $calc($bvar(&write,0) + 1) <body>
              bset -t &write $calc($bvar(&write,0) + 1) <h1> $+ Index of %request $+ </h1>
              bset -t &write $calc($bvar(&write,0) + 1) <table>
              bset -t &write $calc($bvar(&write,0) + 1) <tr>
              bset -t &write $calc($bvar(&write,0) + 1) <th><img src="/icons/blank.gif" alt="[ICO]" width="20" height="22"></th>
              bset -t &write $calc($bvar(&write,0) + 1) <th>Name</th>
              bset -t &write $calc($bvar(&write,0) + 1) <th>Last modified</th>
              bset -t &write $calc($bvar(&write,0) + 1) <th>Size</th>
              bset -t &write $calc($bvar(&write,0) + 1) </tr>
              bset -t &write $calc($bvar(&write,0) + 1) <tr>
              bset -t &write $calc($bvar(&write,0) + 1) <th colspan="4"><hr></th>
              bset -t &write $calc($bvar(&write,0) + 1) </tr>
              if (/*/* iswm %request) {
                bset -t &write $calc($bvar(&write,0) + 1) <tr>
                bset -t &write $calc($bvar(&write,0) + 1) <td valign="top"><img src="/icons/back.gif" alt="[DIR]" width="20" height="22"></td>
                bset -t &write $calc($bvar(&write,0) + 1) <td><a href="/">Parent Directory</a></td>
                bset -t &write $calc($bvar(&write,0) + 1) <td align="right">&nbsp;</td>
                bset -t &write $calc($bvar(&write,0) + 1) <td align="right">-</td>
                bset -t &write $calc($bvar(&write,0) + 1) </tr>
              }
              while (%i) {
                var %object = $line(%window,%i), %type = $gettok(%object,1,32), %i = %i - 1
                if (%type == directory) {
                  var %name = $gettok(%object,4-,32)
                  bset -t &write $calc($bvar(&write,0) + 1) <tr>
                  bset -t &write $calc($bvar(&write,0) + 1) <td valign="top"><img src="/icons/folder.gif" alt="[DIR]" width="20" height="22"></td>
                  bset -t &write $calc($bvar(&write,0) + 1) <td><a href=" $+ %name $+ /"> $+ %name $+ </a>/</td>
                  bset -t &write $calc($bvar(&write,0) + 1) <td align="right">&nbsp;</td>
                  bset -t &write $calc($bvar(&write,0) + 1) <td align="right">-</td>
                  bset -t &write $calc($bvar(&write,0) + 1) </tr>
                }
                elseif (%type == file) {
                  var %lof = $gettok(%object,2,32), %mtime = $gettok(%object,3,32), %name = $gettok(%object,4-,32)
                  bset -t &write $calc($bvar(&write,0) + 1) <tr>
                  bset -t &write $calc($bvar(&write,0) + 1) <td valign="top"><img src="/icons/unknown.gif" alt="[   ]" width="20" height="22"></td>
                  bset -t &write $calc($bvar(&write,0) + 1) <td><a href=" $+ %name $+ "> $+ %name $+ </a></td>
                  bset -t &write $calc($bvar(&write,0) + 1) <td align="right"> $+ $asctime(%mtime,dd-mm-yyyy HH:nn) $+ </td>
                  bset -t &write $calc($bvar(&write,0) + 1) <td align="right"> $+ $bytes(%lof).suf $+ </td>
                  bset -t &write $calc($bvar(&write,0) + 1) </tr>
                }
              }
              bset -t &write $calc($bvar(&write,0) + 1) <tr>
              bset -t &write $calc($bvar(&write,0) + 1) <th colspan="4"><hr></th>
              bset -t &write $calc($bvar(&write,0) + 1) </tr>
              bset -t &write $calc($bvar(&write,0) + 1) </table>
              bset -t &write $calc($bvar(&write,0) + 1) <address> $+ $+(mIRC,/,$version) run as /socklisten -d $sock($hget($sockname,sock)).bindip httpd $sock($hget($sockname,sock)).port $+ </address>
              bset -t &write $calc($bvar(&write,0) + 1) </body>
              bset -t &write $calc($bvar(&write,0) + 1) </html>
              window -c %window
            }
          }
          else {
            var %status = 302
            var %Location: = $+(%request,/)
            var %Content-Type: = text/html
            var %Content-Length: = 170
            hadd $sockname write <html><head><title>302 - Found</title></head><body><h1>302 - Document found</h1>The document you requested have been found in another location.</body></html>
            goto error
          }
        }
      }
      if ($isdir(%path)) {
        var %status = 200
        var %Content-Type: = text/html; charset=utf-8
        var %Content-Length: = $bvar(&write,0)
        var %Cache-Control: = no-cache
        hadd -b $sockname write &write
      }
      elseif ($isfile(%path)) {
        var %status = 200
        var %Content-Type: = application/octet-stream
        var %Content-Length: = $lof(%path)
        var %Last-Modified: = $asctime($file(%path).mtime,ddd $+ $chr(44) dd mmm yyyy HH:nn:ss) GMT
        hadd $sockname lof $lof(%path)
        hadd $sockname path $qt(%path)
        hadd $sockname 0 0
        hadd $sockname -1 $hget($sockname,lof)
      }
      else {
        var %status = 404
        var %Content-Type: = text/html
        var %Content-Length: = 153
        hadd $sockname write <html><head><title>404 - Page not found</title></head><body><h1>404 - Not found</h1>The page you requested could not be found.</body></html>
      }
      :error
      if ($error) {
        var %status = 500
        var %Content-Type: = text/html
        var %Content-Length: = 192
        hadd $sockname write <html><head><title>500 - Internal server error</title></head><body><h1>500 - Internal server error</h1>The server encountered an error while processing your request.</body></html>
        reseterror
      }
      echo -s $sock($sockname).ip - - $asctime($ctime,[dd/mmm/yyyy:HH:nn:ss zz]) $qt($bvar(&method,1,5).text $+($bvar(&request,1,1024).text) $bvar(&version,1,1024).text) %status %Content-Length:
      if ($var(%*:,0)) {
        var %i = $v1 + 3
        var %Date: = $asctime($ctime,ddd $+ $chr(44) dd mmm yyyy HH:nn:ss) GMT
        var %Server: = $+(mIRC,/,$version) HTTP daemon by Spoofing <spoofing@sosnovoborsk.ru>
        var %Connection: = close
        bset -t &head $calc($bvar(&head,0) + 1) HTTP/1.0 %status $replacex(%status,000,Unknown,100,Continue,101,Switching Protocols,102,Processing,200,OK,201,Created,202,Accepted,203,Non-Authoritative Information,204,No Content,205,Reset Content,206,Partial Content,300,Multiple Choices,301,Moved Permanently,302,Found,303,See Other,304,Not Modified,305,Use Proxy,307,Temporary Redirect,400,Bad Request,401,Unauthorized,402,Payment Required,403,Forbidden,404,Not Found,405,Method Not Allowed,406,Not Acceptable,407,Proxy Authentication Required,408,Request Timeout,409,Conflict,410,Gone,411,Length Required,412,Precondition Failed,413,Request Entity Too Large,414,Request-URI Too Large,415,Unsupported Media Type,416,Requested Range Not Satisfiable,417,Expectation Failed,500,Internal Server Error,501,Not Implemented,502,Bad Gateway,503,Service Unavailable,504,Gateway Timeout,505,HTTP Version not supported) $+ $crlf
        while (%i) {
          bset -t &head $calc($bvar(&head,0) + 1) $mid($var(%*:,%i),2) $var(%*:,%i).value $+ $crlf
          dec %i
        }
        bset -t &head $calc($bvar(&head,0) + 1) $crlf
        hadd -b $sockname head &head
      }
      htpacket $sockname
    }
    elseif ($bvar(&read,0) > 16384) {
      hfree $sockname
      sockclose $sockname
    }
    goto rq
  }
}
on *:SOCKWRITE:httpd/*: {
  if ($sockerr) {
    hfree $sockname
    sockclose $sockname
  }
  elseif ($sock($sockname).sq == 0) {
    if ($hget($sockname,error)) {
      hfree $sockname
      sockclose $sockname
    }
    else {
      htpacket $sockname
    }
  }
}
on *:SOCKCLOSE:httpd/*: {
  hfree $sockname
  sockclose $sockname
}

Comments

Sign in to comment.
^Neptune   -  Oct 26, 2010

Neat, but it really baffles me why people do this since it can't support PHP, Perl, Python etc.

http://www.apache.org/

 Respond  
Spoofing   -  Oct 23, 2010

http://83.143.33.145/index.mrc

I added mIRC Serverside Scripting support (=

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.