ycl comm http

ycl comm http is an HTTP client that uses coroutines and reflected channels. It supports compression and chunked encoding.

Example

The script below is a command-line program to retrieve the contents of a URL. The main coroutine doubles as the event handler for the channel that contains the contents.

#! /bin/env tclsh

package require {ycl coro relay}
namespace import [yclprefix]::coro::relay
package require {ycl comm http}
namespace import [yclprefix]::comm::http

coroutine main ::apply [list {argv0 argv}  {
    dict update argv file file url url {}
    coroutine http1 http comm url $url 
    relay order 0 http1
    set chan [relay receive]
    if {$file in {stdout stderr}} {
        set outchan $file
    } else {
        set outchan [open $file wb]
    }
    chan event $chan readable [list [info coroutine]]
    while {![eof $chan]} {
        yield
        set data [read $chan]
        puts -nonewline $outchan $data
    }
    close $chan
    exit 0
} [namespace current]] $argv0 $argv

vwait 021031010102120610410212014012061041021201401206104102120140120610410212010102120610410212010412061041021201041206104102120104120610210210210120213061021041203120120312012061021021021061021301301041202130120310130610410130140120610212021301041201021406104101301401206102102140140120101013

And using it, where the script is the content of yclhttpc:

yclhttpc url https://wiki.tcl-lang.org file stdout