Downloading File
Filename: Download Alias
; Download alias v0.3 created by Chessnut of SwiftIRC/Undernet.
;
; Usage:
; /download URL, or /.download URL to suppress echoes
;
; A signal will be triggered once the download fails or succeeds. The signal is named "download".
;
; In the signal:
; $1 contains $true or $false depending if the download fails or succeeds
; $2- contains the short file name (i.e. rfc1945.txt).
;
; Alias to convert all hexadecimal elements in the filename to plain text, such as %20 for a space
alias -l urldecode return $regsubex($1-,/%([\da-f]{2})/ig,$chr($base(\1,16,10)))
alias download {
; Check for unique socket name
var %checkID 1
while ($sock(dload2. $+ %checkID)) inc %checkID
var %url $remove($1,http://,https://), $&
%hostAndPort $gettok(%url,1,47), $&
%host $gettok(%hostAndPort,1,58), $&
%port $gettok(%hostAndPort,2,58), $&
%pageAndFile $replace(/ $+ $gettok(%url,2-,47),$chr(32),/), $&
%file $urldecode($gettok($gettok(%pageAndFile,-1,47),1,63)), $&
%ID dload2. $+ %checkID, $&
%isFile $isfile(%file)
; Horribly long regex statement to check for an invalid URL.
if (!$regex($1,/^(?:(?:https?://)?(?:[-a-z\d.]+\.[a-z]{2,}|localhost|(?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\b\.){3} (?:\b25[0-5]|2[0-4]\d|[01]?\d?\d\b))(?::\d+)?(?:/[^\\|/?><:*^]+)+)(\?[^&]*(&[^&]*)*)?$/ix)) {
if ($show) echo 4 Invalid download file.
.signal download $false %file
}
elseif (%isFile) {
if ($show) echo 4 %file already exists in your mIRC directory.
.signal download $false %file
}
elseif (!%isFile) {
; Check if an SSL connection needs to be made
if (https://* iswm $1) {
if ($sslready) sockopen -e %ID %host $iif(%port,$v1,443)
else {
if ($show) echo 4 You need SSL support to download this file.
.signal download $false %file
}
}
else sockopen %ID %host $iif(%port,$v1,80)
if ($sock(%ID)) sockmark %ID $show %pageAndFile
}
}
on *:sockopen:dload2.*:{
; The sockmark contains a boolean value for whether the script should echo and the page of the document
tokenize 32 $sock($sockname).mark
if ($sockerr) .signal download $false $urldecode($gettok($gettok($2-,-1,47),1,63))
if ($1 && $sockerr == 3) echo 4 Failure establishing socket connection: $sock($sockname).wserr
elseif ($1 && $sockerr == 4) echo 4 Error resolving hostname: $sock($sockname).addr
elseif ($1 && $sockerr > 0) echo 4 Unknown socket error, error code: $v1
elseif (!$sockerr) {
sockwrite -nt $sockname GET $2 HTTP/1.0
sockwrite $sockname $+(Host: $sock($sockname).addr,:,$sock($sockname).port,$crlf,$crlf)
}
}
on *:sockread:dload2.*:{
tokenize 32 $sock($sockname).mark
var %file $urldecode($gettok($gettok($2-,-1,47),1,63))
if ($sockerr) .signal download $false %file
if ($1 && $sockerr == 3) echo 4 Error reading socket: $sock($sockname).wserr
elseif ($1 && $sockerr > 0) echo 4 Unknown error reading socket, error code: $v1
elseif (!$v1 && !$sockerr) {
if ($0 == 2) {
var %length 0,%header,%redirect $false
sockread %header
; Check the HTTP Status to see if the resource has moved
if ($regex(%header,/^HTTP/1\.[01] (3\d\d .+)/)) {
if ($1) echo 6 Document4 %file has moved. HTTP Status: $regml(1)
var %redirect $true
}
; Check the HTTP Status to see if the resource could not be found
elseif ($regex(%header,/^HTTP/1\.[01] ([45]\d\d .+)/)) {
if ($1) echo 4 HTTP Error downloading4 %file ( $+ $regml(1) $+ )
.signal download $false $3-
sockclose $sockname
halt
}
if ($regex(%header,/^HTTP/1\.[01] 200/) || %redirect) {
while (%header) {
sockread %header
if (Content-Length: * iswm %header) var %length $gettok(%header,2,32)
; If the resource has moved, download the file from the new location.
elseif (Location: * iswm %header) {
if ($1) echo 6 Document has moved to4 $gettok(%header,2-,32) $+ . Downloading from new location...
download $gettok(%header,2-,32)
sockclose $sockname
halt
}
}
; If the resource has moved, but no new location is specified, it will halt here
if (%redirect) {
if ($1) echo 4 Error downloading file (No new path specified)
.signal download $false %file
sockclose $sockname
halt
}
sockmark $sockname $1 %length %file
tokenize 32 $sock($sockname).mark
if ($1) echo 6 Downloading4 $3- ( $+ $iif($2,$bytes($2,3).suf,Unknown size) $+ )
}
else {
if ($1) echo 4 Unknown error occurred: %header
.signal download $false $3-
sockclose $sockname
halt
}
}
; If everything went smoothly, download the file
sockread &content
bwrite $qt($3-) -1 -1 &content
; If the file has finished downloading, output the message.
if ($file($3-).size >= $2) {
if ($1) echo 3 File4 $3- downloaded successfully (Elapsed time: $duration($sock($sockname).to) $+ )
.signal download $true $3-
sockclose $sockname
}
}
}
on *:sockclose:dload2.*:{
tokenize 32 $sock($sockname).mark
if ($sockerr == 3) echo 4 An error occurred while receiving data, or a SSL error occurred: $sock($sockname).wserr
elseif ($sockerr == 5) echo 4 An SSL error occurred on sockopen
elseif ($v1) echo 4 Socket unexpectedly closed, error code: $v1
else echo 3 Either the file4 $gettok($sock($sockname).mark,3-,32) downloaded successfully, or the connection was closed prematurely. (Elapsed time: $duration($sock($sockname).to) $+ )
.signal download $iif($sockerr,$false,$true) $3-
}


