http in Jacl

Jacl doesn't currently have the http package available as part of its built-in library, but you can use Jacl's java package to retrieve a URL.

Here is a small procedure to retrieve a text document via the java.net.URL class. If you want to retrieve binary data, you'll need to write a similar procedure that returns the raw bytes (instead of converting to strings, as this procedure does.)


package require java

# getUrl - returns a list of 4 elements
#          {contentType contentLength contentEncoding contentData}
#          NOTE: no error handling

proc getUrl {url} {
    set url [java::new java.net.URL $url]
    set urlconn [$url openConnection]

    set contentType [$urlconn getContentType]
    set contentLength [$urlconn getContentLength]
    set contentEncoding [$urlconn getContentEncoding]
    set contentInputStream [$urlconn getInputStream]

    set bufSize 65536
    set contentData ""
    set byteArray [java::new {byte[]} $bufSize]
    while { [set len [$contentInputStream read $byteArray]] >= 0 } {
        append contentData [[java::new {String byte[] int int} $byteArray 0 $len] toString]
    }
    $contentInputStream close

    return [list $contentType $contentLength $contentEncoding $contentData]
}

# sample

set urldata [getUrl https://wiki.tcl-lang.org]
puts "content type: [lindex $urldata 0]"
puts "content length: [lindex $urldata 1]"
puts "content encoding: [lindex $urldata 2]"
puts "content data: [lindex $urldata 3]"