Hi everyone

About a month ago Harald proposed a script to parse 'Accept' HTTP header
lines. He has written a larger and more complete version of
his ::rivet::accept_list procedure which was given the temporary
name ::rivet::http_accept2dict. Here is the code. Comments and proposals
are welcome (my proposal is to name it ::rivet::http_accept
or ::rivet::http_parse_accept or ::rivet::parse_accept)

I propose also to add a -list switch which could easily emulate
the ::rivet::accept_list procedure Harald had posted on this list in
April. 

if no one objects I will commit it

 -- Massimo



proc ::rivet::http_accept2dict {args} {
    set lqValues {}
    set lItems {}
    # parameter
    while { [llength $args] > 1 } {
        set args [lassign $args argCur]
        switch -exact -- $argCur {
            -zeroweight { set fZeroWeight 1 }
            -default { set fDefault 1 }
            -- {}
            default { return -code error "Unknown argument '$argCur'" }
        }
    }
    # loop over comma-separated items
    foreach itemCur [split [lindex $args 0] ,] {
        # Find q value as last element separated by ;
        set qCur 1
        if {[regexp {^(.*); *q=([^;]*)$} $itemCur match itemCur
qString]} {
            if { 1 == [scan $qString %f qVal] && $qVal >= 0 && $qVal <=
1 } {
                    set qCur $qVal
            }
        }
        set itemCur [string trim $itemCur]
        if { $itemCur in {"*" "*/*" "*-*"} } {
            unsetset -nocomplain fDefault
        }
        if { [info exists fZeroWeight] || $qCur > 0 } {
            lappend lqValues $qCur
            lappend lItems $itemCur
        }
    }
    # build output dict in decreasing q order
    set dOut {}
    foreach indexCur [lsort -real -decreasing -indices $lqValues] {
        set qCur [lindex $lqValues $indexCur]
        if {$qCur == 0 && [info exists fDefault]} {
            dict set dOut * 0.01
            unset fDefault
        }
        dict set dOut [lindex $lItems $indexCur] $qCur
    }
    if { [info exists fDefault] } {
        dict set dOut * 0.01
    }
    return $dOut
}

 


---------------------------------------------------------------------
To unsubscribe, e-mail: rivet-dev-unsubscr...@tcl.apache.org
For additional commands, e-mail: rivet-dev-h...@tcl.apache.org

Reply via email to