;Setup redirection settings ;Usage: $download(,[Save Directory],[Save File Name]) on *:START: { unset %file_dl.* } alias download { var %time = $ticks ;Settings Variables var %directory = $mircdir\download var %redirect_limits = 3 ;End Settings Variables ;Determine download directory if (!$isid) { var %error = Please use in identifier format: $download(,[save directory],[save filename]) | goto error } if ($2) %directory = $v1 if (!$isdir($nofile(%directory))) { var %error = Download directory does not exist. | goto error } ;Determine download target properties var %url_regex = /(?:\s|\G)((?:(?:http(s?):\/\/|www\.())(?:[\w-]*\.)*?(?:[\w-]*)(?:\.[a-z]{2,5}(?:\.[a-z]{2})?))|(?:http(s?):\/\/(?:\d{1,3}\.){3}\d{1,3}))((?::\d{1,5}?)?)((?:\/\S*)*)(?:\s|$)/i var %match = $regex($strip($1-),%url_regex)) if (!%match) { var %error = Valid URL required for download. | goto error } ;;Determine download port var %secure = $false if ($regml(2)) { var %port = 443 %secure = $true } else var %port = 80 if ($regml(3)) %port = $right($v1,-1) ;;Determine download host var %host = $remove($regml(1),http://,https://) ;Set socket information variables set %file_dl.path. [ $+ [ %time ] ] $iif($regml(4),$v1,/) set %file_dl.head. [ $+ [ %time ] ] 1 ;Set filename/path if ($3) set %file_dl.save. [ $+ [ %time ] ] $v1 elseif ($regex($gettok($gettok(%file_dl.path. [ $+ [ %time ] ],-1,47\),-1,92),/([^?&#:*"<>]+)/)) set %file_dl.save. [ $+ [ %time ] ] $regml(1) else set %file_dl.save. [ $+ [ %time ] ] index.html %file_dl.save. [ $+ [ %time ] ] = $+(%directory,$iif($right(%directory,1) !isin \/,/),%file_dl.save. [ $+ [ %time ] ]) if $exists(%file_dl.save. [ $+ [ %time ] ]) { var %error = File already exists. | goto error } sockopen $iif(%secure,-e) download. $+ %time %host %port ;Done return Initiated %time :error $iif($isid,return,echo 4 -a) Error: $iif(%error,$v1,$error) reseterror unset %file_dl.*. [ $+ [ %time ] ] } on *:SOCKOPEN:download.*: { if ($sockerr) { download_close $sockname | return } sockwrite -nt $sockname GET %file_dl.path. [ $+ [ $gettok($sockname,-1,46) ] ] HTTP/1.1 sockwrite -nt $sockname Host: $sock($sockname).addr sockwrite -nt $sockname Accept-Language: en-us sockwrite -nt $sockname User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 sockwrite -nt $sockname Accept: */* sockwrite -nt $sockname Connection: close sockwrite -nt $sockname } on *:SOCKREAD:download.*: { if ($sockerr > 0) return var %download_read var %time = $gettok($sockname,-1,46) :download_read ;Process Headers First if (%file_dl.head. [ $+ [ %time ] ]) { sockread %download_read if (!%download_read) { unset %file_dl.head. [ $+ [ %time ] ] goto download_read } if ($regex(redirect,%download_read,/Location:\s(.*?)$/i)) { var %new_page = $iif(!$regex($left($regml(redirect,1),8),/^http(s)?:\/\//i),$+(http,$iif($sock($sockname).ssl,s),://,$sock($sockname).addr,:,$sock($sockname).port,$iif($left($regml(redirect,1),1) != /,/),$regml(redirect,1)),$regml(redirect,1)) download $sockname %new_page download_close $sockname return } if ($regex(range,%download_read,/Accept-Ranges:\s(.*?)$/i)) { set %file_dl.range. [ $+ [ $regml(range,1) ] ] goto download_read } if ($regex(size,%download_read,/Content-Length:\s(.*?)$/i)) { set %file_dl.size. [ $+ [ $regml(size,1) ] ] goto download_read } goto download_read } ;Headers are done, process file download sockread -f &download_read bwrite $qt(%file_dl.save. [ $+ [ %time ] ]) -1 $sockbr &download_read if ($sockbr == 0) return goto download_read :error echo 4 -a Error: $error reseterror download_close $sockname return } on *:SOCKCLOSE:download.*: { echo -a Download complete: $qt(%file_dl.save. [ $+ [ $gettok($sockname,-1,46) ] ]) download_close $sockname } alias -l download_close { var %time = $gettok($1,-1,46) if ($sock(download. $+ %time)) sockclose download. $+ %time unset %download.*. [ $+ [ %time ] ] }