Tcl Source Code

View Ticket
Login
Bounty program for improvements to Tcl and certain Tcl packages.
Ticket UUID: 3498327
Title: http::formatQuery RFC 3986 compliance, AWS Compatibility fix
Type: Patch Version: None
Submitter: samoconnor Created on: 2012-03-07 07:17:48
Subsystem: 29. http Package Assigned To: andreas_kupries
Priority: 3 Low Severity:
Status: Closed Last Modified: 2012-03-08 02:01:05
Resolution: Fixed Closed By: andreas_kupries
    Closed on: 2012-03-07 19:01:05
Description:
http://tools.ietf.org/html/rfc3986 2.1. says:
"... URI producers and normalizers should use uppercase hexadecimal digits for all percent-encodings."

The patch below fixes the encoding map created in http::init to use uppercase hex digits.
Lower case hex encoding currently produced by Tcl's http:: causes at least one Amazon AWS authentication scheme to fail.
As it stands, every Tcl AWS tool has to implement its own special url encoder (e.g. tclib::3S, tclcloud, etc).
With this patch http::formatQuery can be used to prepare AWS requests.

See http://docs.amazonwebservices.com/AWSSimpleQueueService/2011-10-01/SQSDeveloperGuide/Query_QueryAuth.html.


--- tcl8.6b1/library/http/http.tcl.orig2012-03-07 17:57:05.000000000 +1100
+++ tcl8.6b1/library/http/http.tcl2012-03-07 17:57:15.000000000 +1100
@@ -39,7 +39,7 @@
 for {set i 0} {$i <= 256} {incr i} {
     set c [format %c $i]
     if {![string match {[-._~a-zA-Z0-9]} $c]} {
-set map($c) %[format %.2x $i]
+set map($c) %[format %.2X $i]
     }
 }
 # These are handled specially


In the meantime the following "dynamic" patch serves a work-around:

dict for {n v} $::http::formMap {
    dict set ::http::formMap $n [string toupper $v]
}
User Comments: andreas_kupries added on 2012-03-08 02:01:05:
allow_comments - 1

andreas_kupries added on 2012-03-08 02:01:04:
Committed changes to all branches. Including updated tests. Including the %0d/%0a change.

andreas_kupries added on 2012-03-08 01:19:00:
Question, what about the command

set map(\n) %0d%0a

a few lines below. Should that not also be changed, to %0D%0A ?