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"> </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"> </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
}