alias mysocket {
if (www.?*.??* iswm $2) tokenize 32 $1 http:// $+ $2
if (http://?*.??* iswm $2) || (https://?*.??* iswm $2) {
var %e = $iif($gettok($2,1,47) == https:,-e),%a $gettok($2,2,47),%p $iif($gettok(%a,2,58) isnum 60-65535,$v1,$iif(%e,443,80)),%a $gettok(%a,1,58),%s $sha1($2,0) $+ .mysocket
.remove %s
sockclose %s
hfree -w %s
hmake %s
hadd %s command $1
hadd %s full $2
hadd %s port %p
hadd %s host %a
hadd %s path $iif($gettok($2,3-,47),/ $+ $v1 $+ $iif($right($2,1) == /,/),/)
hadd %s r 0
sockopen %e %s %a %p
.timermysocket.check -io 1 120 mysocket.check
if ($isid) return %s
}
else $iif($isid,return,echo -a Invalid input, us as: /mysocket <command> <link>)
}
on *:start:noop $findfile($scriptdir,????????????????????????????????????????.mysocket,0,0,.remove $qt($1-))
alias -l mysocket.check {
var %x = 1
while ($hget(%x) != $null) { if (*.mysocket iswm $v1) hfree -w $v1 | else inc %x }
while ($sock(*.mysocket,1)) sockclose $v1
}
on *:sockopen:*.mysocket: {
tokenize 32 $sockname
if ($sockerr) mysocket.e $1 open $v1 $sock($1).wsmsg
else {
sockwrite -tn $1 GET $hget($1,path) HTTP/1.1
sockwrite -tn $1 Host: $hget($1,host)
sockwrite -tn $1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0
sockwrite -tn $1 Accept: text/html
sockwrite -tn $1 Connection: close
sockwrite -t $1 $crlf
}
}
on *:sockread:*.mysocket: {
tokenize 32 $sockname
if ($sockerr) mysocket.e $1 read
elseif ($hget($1,r)) mysocket.r $1
else {
sockread -f %c.t
while ($sockbr > 2) { hadd $1 %c.t | sockread -f %c.t }
if ($sockbr) { hadd $1 r $calc($sock($1).rcvd +$iif($hget($1,Content-Length:) <= 2097152,$v1,$v2)) | if ($sock($1).rq) mysocket.r $1 }
}
}
on *:sockclose:*.mysocket:mysocket.d $sockname done
alias -l mysocket.r {
sockread $sock($1).rq &b
bwrite $1 -1 &b
if ($sock($1).rcvd >= $hget($1,r)) mysocket.d $1 done
}
alias -l mysocket.e {
$hget($1,command) $1 error $2 $sockerr $sock($1).wsmsg
.remove $1
hfree -w $1
sockclose $1
}
alias -l mysocket.d {
if ($hget($1,Transfer-Encoding:) == chunked) {
var %y = 1
bread $1 0 $file($1).size &f
while ($bfind(&f,%y,$crlf).text) {
var %v = $v1,%h $bvar(&f,%y,$calc(%v -%y)).text,%r $base(%h,16,10),%y $calc(%v +4+%r)
if (%r == 0) break
else bcopy &mysocket $calc(1+$bvar(&mysocket,0)) &f $calc(2+%v) %r
}
}
else bread $1 0 $file($1).size &mysocket
$hget($1,command) $1 done
.remove $1
hfree -w $1
sockclose $1
}