Uzun zaman önce ilk versiyonunu buradan paylaştığım ve sonradan bir takım eklemeler yaptığım "socker", web sunucusuna header paketi göndermenin ve sonuçlarını görüntülemenin yanı sıra, belirtilen header paketine göre örnek bir socket scripti derlemeye yardımcı oluyor.
Kod:
alias socker {
if ($1) {
var %i = 1, %y = 1
while ($cb(%y)) { if ($istok($cb(%y),Host:,32)) var %x = $gettok($cb(%y),2,32) | inc %y }
echo -a alias $1 sockopen $1 %x 80
echo -a on $+(*:sockopen:,$1,:,$chr(123))
echo -a var $chr(37) $+ -> = sockwrite -n $!sockname
while (%i <= $cb(0)) {
if ($regex($cb(%i),Connection:)) { echo -a $(%->,0) Connection: Close | inc %i }
if (!$regex($cb(%i),Encoding:)) echo -a $(%->,0) $cb(%i)
inc %i
}
echo -a $chr(125)
echo -a on *:sockread: $+ $1 $+ : $+ $chr(123)
echo -a sockread -fn &tmp
echo -a $(echo - $bvar(&tmp,1-).text,0)
echo -a $chr(125)
return
}
var %i = 1
while (%i <= $cb(0)) {
echo - $cb(%i)
if ($regex($gettok($cb(%i),1,32),Host:)) {
if ($sock(%s.name).name) sockclose %s.name
%s.name = $gettok($cb(%i),2,32)
sockopen %s.name %s.name 80
}
inc %i
}
}
on *:sockopen:$(%s.name):{
var %i = 1, %x = 0
while (%i <= $cb(0)) {
if (!$cb(%i)) sockwrite -n $sockname $crlf
if ($gettok($cb(%i),1,32) != Accept-Encoding:) {
echo 7 -a *** Uygulanan header: sockwrite -n $sockname $cb(%i)
sockwrite -n $sockname $cb(%i)
}
inc %i
}
sockwrite -n $sockname $crlf
}
on *:sockread:$(%s.name):sockread -fn &tmp | echo - $bvar(&tmp,1-).text
on *:sockclose:$(%s.name):unset %s.name
Örnekle aşağıdaki header paketini kopyalıyorum, sonra /socker komutunu kullanarak paketi sunucuya gönderiyor ve gelen cevapları görüntülüyorum.
Örnek header paketi:
Kod:
GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: tr-TR
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: www.mircscripting.net
Connection: Keep-Alive
Örnek script derleme güncellemesi ise, bu örnek header paketini kopyalayıp /socker MSNet komutunu giriyorum ve belirtilen headera göre derlenmiş script ediniyorum. Komut, aktif pencerede şu sonucu veriyor:
Kod:
alias MSNet sockopen MSNet www.mircscripting.net 80
on *:sockopen:MSNet:{
var %-> = sockwrite -n $sockname
%-> GET / HTTP/1.1
%-> Accept: text/html, application/xhtml+xml, */*
%-> Accept-Language: tr-TR
%-> User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
%-> Host: www.mircscripting.net
%-> Connection: Close
%->
}
on *:sockread:MSNet:{
sockread -fn &tmp
echo - $bvar(&tmp,1-).text
}
Not: Bu arada, $bvar kafa karıştırabilir belki. "Normal %değişken varken ne gerek vardı ona" diye düşündürebilir. Mesele şu ki ajax vs. gibi kaynağa sahip olan web sayfalarındaki verilerin uzunluğu, bazen normal %değişkenin limitinin üstünde olabiliyor ve bilgi eksik görüntüleniyor. Ayrıca bir uyarı da almıyorsunuz ve princin taşını ayıklar gibi saatlerce sorun arıyorsunuz. Neyse ki $bvar'ın barındırabildiği karakter uzunluğu bi hayli fazla. Bazen aktif pencereye yansıtamayacak kadar uzun bir string barındırsa da, en azından kendi içinde saklayabiliyor. "Görüntülenemeyebilirim ama içimde saklıyorum, ayıkla kullan" diyor alet bi bakıma.