diff options
Diffstat (limited to 'tests/http.test')
| -rw-r--r-- | tests/http.test | 1109 |
1 files changed, 227 insertions, 882 deletions
diff --git a/tests/http.test b/tests/http.test index c77dceb..2fc0a51 100644 --- a/tests/http.test +++ b/tests/http.test @@ -1,27 +1,35 @@ # Commands covered: http::config, http::geturl, http::wait, http::reset # # This file contains a collection of tests for the http script library. -# Sourcing this file into Tcl runs the tests and generates output for errors. -# No output means no errors were found. +# Sourcing this file into Tcl runs the tests and +# generates output for errors. No output means no errors were found. # -# Copyright © 1991-1993 The Regents of the University of California. -# Copyright © 1994-1996 Sun Microsystems, Inc. -# Copyright © 1998-2000 Ajuba Solutions. +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# Copyright (c) 1998-2000 by Ajuba Solutions. # -# See the file "license.terms" for information on usage and redistribution of -# this file, and for a DISCLAIMER OF ALL WARRANTIES. +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -if {"::tcltest" ni [namespace children]} { - package require tcltest 2.5 +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest 2 namespace import -force ::tcltest::* } -source [file join [file dirname [info script]] tcltests.tcl] -package require http 2.10 -#http::register http 80 ::socket - -# To write a separate summary for each value of ThreadLevel, set constraint ThreadLevelSummary. -#testConstraint ThreadLevelSummary 0 +if {[catch {package require http 2} version]} { + if {[info exists http2]} { + catch {puts "Cannot load http 2.* package"} + return + } else { + catch {puts "Running http 2.* tests in slave interp"} + set interp [interp create http2] + $interp eval [list set http2 "running"] + $interp eval [list set argv $argv] + $interp eval [list source [info script]] + interp delete $interp + return + } +} proc bgerror {args} { global errorInfo @@ -30,11 +38,8 @@ proc bgerror {args} { puts stderr $errorInfo } -# Do not use [info hostname]. -# Name resolution is often a problem on OSX; not focus of HTTP package anyway. -# Also a problem on other platforms for http-4.14 (test with bad port number). -set HOST localhost -set bindata "This is binary data\x0D\x0Amore\x0Dmore\x0Amore\x00null" +set port 8010 +set bindata "This is binary data\x0d\x0amore\x0dmore\x0amore\x00null" catch {unset data} # Ensure httpd file exists @@ -48,13 +53,14 @@ if {![file exists $httpdFile]} { set removeHttpd 1 } -catch {package require Thread 2.7-} -if {[catch {package present Thread}] == 0 && [file exists $httpdFile]} { - set httpthread [thread::create -preserved] - lappend threadStack [list thread::release $httpthread] - thread::send $httpthread [list source $httpdFile] - thread::send $httpthread [list set bindata $bindata] - thread::send $httpthread {httpd_init 0; set port} port +if {[info commands testthread] == "testthread" && [file exists $httpdFile]} { + set httpthread [testthread create -joinable " + source [list $httpdFile] + testthread wait + "] + testthread send $httpthread [list set port $port] + testthread send $httpthread [list set bindata $bindata] + testthread send $httpthread {httpd_init $port} puts "Running httpd in thread $httpthread" } else { if {![file exists $httpdFile]} { @@ -66,54 +72,23 @@ if {[catch {package present Thread}] == 0 && [file exists $httpdFile]} { # Let the OS pick the port; that's much more flexible if {[catch {httpd_init 0} listen]} { puts "Cannot start http server, http test skipped" - catch {unset port} + unset port return - } - set threadStack {} -} - -if 0 { - # For debugging: run with a single value of ThreadLevel: 0|1|2 - set ThreadLevel 0 - testConstraint ThreadLevelSummary 1 -} -if {![info exists ThreadLevel]} { - if {[catch {package require Thread}] == 0} { - set ValueRange {0 1 2} } else { - set ValueRange {0 1} - } - - # For each value of ThreadLevel, source this file recursively in the - # same interpreter. - foreach ThreadLevel $ValueRange { - source [info script] - } - if {[llength $threadStack]} { - eval [lpop threadStack] + set port [lindex [fconfigure $listen -sockname] 2] } - catch {unset ThreadLevel} - catch {unset ValueRange} - if {![testConstraint ThreadLevelSummary]} { - ::tcltest::cleanupTests - } - return } -catch {puts "==== Test with ThreadLevel $ThreadLevel ===="} -http::config -threadlevel $ThreadLevel - -test http-1.1.$ThreadLevel {http::config} { - http::config -useragent UserAgent +test http-1.1 {http::config} { http::config -} [list -accept */* -cookiejar {} -pipeline 1 -postfresh 0 -proxyauth {} -proxyfilter http::ProxyRequired -proxyhost {} -proxynot {} -proxyport {} -repost 0 -threadlevel $ThreadLevel -urlencoding utf-8 -useragent UserAgent -zip 1] -test http-1.2.$ThreadLevel {http::config} { +} [list -accept */* -proxyfilter http::ProxyRequired -proxyhost {} -proxyport {} -urlencoding utf-8 -useragent "Tcl http client package $version"] +test http-1.2 {http::config} { http::config -proxyfilter } http::ProxyRequired -test http-1.3.$ThreadLevel {http::config} { +test http-1.3 {http::config} { catch {http::config -junk} } 1 -test http-1.4.$ThreadLevel {http::config} { +test http-1.4 {http::config} { set savedconf [http::config] http::config -proxyhost nowhere.come -proxyport 8080 \ -proxyfilter myFilter -useragent "Tcl Test Suite" \ @@ -121,125 +96,85 @@ test http-1.4.$ThreadLevel {http::config} { set x [http::config] http::config {*}$savedconf set x -} [list -accept */* -cookiejar {} -pipeline 1 -postfresh 0 -proxyauth {} -proxyfilter myFilter -proxyhost nowhere.come -proxynot {} -proxyport 8080 -repost 0 -threadlevel $ThreadLevel -urlencoding iso8859-1 -useragent {Tcl Test Suite} -zip 1] -test http-1.5.$ThreadLevel {http::config} -returnCodes error -body { - http::config -proxyhost {} -junk 8080 -} -result {Unknown option -junk, must be: -accept, -cookiejar, -pipeline, -postfresh, -proxyauth, -proxyfilter, -proxyhost, -proxynot, -proxyport, -repost, -threadlevel, -urlencoding, -useragent, -zip} -test http-1.6.$ThreadLevel {http::config} -setup { - set oldenc [http::config -urlencoding] -} -body { +} {-accept */* -proxyfilter myFilter -proxyhost nowhere.come -proxyport 8080 -urlencoding iso8859-1 -useragent {Tcl Test Suite}} +test http-1.5 {http::config} { + list [catch {http::config -proxyhost {} -junk 8080} msg] $msg +} {1 {Unknown option -junk, must be: -accept, -proxyfilter, -proxyhost, -proxyport, -urlencoding, -useragent}} +test http-1.6 {http::config} { set enc [list [http::config -urlencoding]] http::config -urlencoding iso8859-1 lappend enc [http::config -urlencoding] -} -cleanup { - http::config -urlencoding $oldenc -} -result {utf-8 iso8859-1} + http::config -urlencoding [lindex $enc 0] + set enc +} {utf-8 iso8859-1} -test http-2.1.$ThreadLevel {http::reset} { +test http-2.1 {http::reset} { catch {http::reset http#1} } 0 -test http-2.2.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding iso-8859-11 -} iso8859-11 -test http-2.3.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding iso-2022-kr -} iso2022-kr -test http-2.4.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding shift-jis -} shiftjis -test http-2.5.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding windows-437 -} cp437 -test http-2.6.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding latin5 -} iso8859-9 -test http-2.7.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding latin1 -} iso8859-1 -test http-2.8.$ThreadLevel {http::CharsetToEncoding} { - http::CharsetToEncoding latin4 -} binary - -test http-3.1.$ThreadLevel {http::geturl} -returnCodes error -body { - http::geturl -bogus flag -} -result {Unknown option flag, can be: -binary, -blocksize, -channel, -command, -guesstype, -handler, -headers, -keepalive, -method, -myaddr, -progress, -protocol, -query, -queryblocksize, -querychannel, -queryprogress, -strict, -timeout, -type, -validate} - -test http-3.2.$ThreadLevel {http::geturl} -returnCodes error -body { - http::geturl http:junk -} -result {Unsupported URL: http:junk} -set url //${::HOST}:$port -set badurl //${::HOST}:[expr {$port+1}] -test http-3.3.$ThreadLevel {http::geturl} -body { +test http-3.1 {http::geturl} { + list [catch {http::geturl -bogus flag} msg] $msg +} {1 {Unknown option flag, can be: -binary, -blocksize, -channel, -command, -handler, -headers, -keepalive, -method, -myaddr, -progress, -protocol, -query, -queryblocksize, -querychannel, -queryprogress, -strict, -timeout, -type, -validate}} +test http-3.2 {http::geturl} { + catch {http::geturl http:junk} err + set err +} {Unsupported URL: http:junk} +set url //[info hostname]:$port +set badurl //[info hostname]:[expr $port+1] +test http-3.3 {http::geturl} { set token [http::geturl $url] http::data $token -} -cleanup { - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET /</h2> </body></html>" - set tail /a/b/c -set url //${::HOST}:$port/a/b/c -set fullurl HTTP://user:pass@${::HOST}:$port/a/b/c -set binurl //${::HOST}:$port/binary -set xmlurl //${::HOST}:$port/xml -set posturl //${::HOST}:$port/post -set badposturl //${::HOST}:$port/droppost -set authorityurl //${::HOST}:$port -set ipv6url http://\[::1\]:$port/ - -test http-3.4.$ThreadLevel {http::geturl} -body { +set url //[info hostname]:$port/a/b/c +set fullurl HTTP://user:pass@[info hostname]:$port/a/b/c +set binurl //[info hostname]:$port/binary +set posturl //[info hostname]:$port/post +set badposturl //[info hostname]:$port/droppost +set authorityurl //[info hostname]:$port +test http-3.4 {http::geturl} { set token [http::geturl $url] http::data $token -} -cleanup { - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET $tail</h2> </body></html>" proc selfproxy {host} { global port - return [list ${::HOST} $port] + return [list [info hostname] $port] } -test http-3.5.$ThreadLevel {http::geturl} -body { +test http-3.5 {http::geturl} { http::config -proxyfilter selfproxy set token [http::geturl $url] - http::data $token -} -cleanup { http::config -proxyfilter http::ProxyRequired - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> + http::data $token +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET http:$url</h2> </body></html>" -test http-3.6.$ThreadLevel {http::geturl} -body { +test http-3.6 {http::geturl} { http::config -proxyfilter bogus set token [http::geturl $url] - http::data $token -} -cleanup { http::config -proxyfilter http::ProxyRequired - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> + http::data $token +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET $tail</h2> </body></html>" -test http-3.7.$ThreadLevel {http::geturl} -body { +test http-3.7 {http::geturl} { set token [http::geturl $url -headers {Pragma no-cache}] http::data $token -} -cleanup { - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET $tail</h2> </body></html>" -test http-3.8.$ThreadLevel {http::geturl} -body { - set token [http::geturl $url -query Name=Value&Foo=Bar -timeout 3000] +test http-3.8 {http::geturl} { + set token [http::geturl $url -query Name=Value&Foo=Bar -timeout 2000] http::data $token -} -cleanup { - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>POST $tail</h2> <h2>Query</h2> @@ -248,13 +183,11 @@ test http-3.8.$ThreadLevel {http::geturl} -body { <dt>Foo<dd>Bar </dl> </body></html>" -test http-3.9.$ThreadLevel {http::geturl} -body { +test http-3.9 {http::geturl} { set token [http::geturl $url -validate 1] http::code $token -} -cleanup { - catch {http::cleanup $token} -} -result "HTTP/1.0 200 OK" -test http-3.10.$ThreadLevel {http::geturl queryprogress} -setup { +} "HTTP/1.0 200 OK" +test http-3.10 {http::geturl queryprogress} { set query foo=bar set sep "" set i 0 @@ -264,20 +197,18 @@ test http-3.10.$ThreadLevel {http::geturl queryprogress} -setup { append query $sep$query set sep & } -} -body { - proc postProgress {tok x y} { + + proc postProgress {token x y} { global postProgress lappend postProgress $y } set postProgress {} - set token [http::geturl $posturl -keepalive 0 -query $query \ + set t [http::geturl $posturl -keepalive 0 -query $query \ -queryprogress postProgress -queryblocksize 16384] - http::wait $token - list [http::status $token] [string length $query] $postProgress [http::data $token] -} -cleanup { - catch {http::cleanup $token} -} -result {ok 122879 {16384 32768 49152 65536 81920 98304 114688 122879} {Got 122879 bytes}} -test http-3.11.$ThreadLevel {http::geturl querychannel with -command} -setup { + http::wait $t + list [http::status $t] [string length $query] $postProgress [http::data $t] +} {ok 122879 {16384 32768 49152 65536 81920 98304 114688 122879} {Got 122879 bytes}} +test http-3.11 {http::geturl querychannel with -command} { set query foo=bar set sep "" set i 0 @@ -288,35 +219,36 @@ test http-3.11.$ThreadLevel {http::geturl querychannel with -command} -setup { set sep & } set file [makeFile $query outdata] -} -body { set fp [open $file] - proc asyncCB {tok} { + + proc asyncCB {token} { global postResult - lappend postResult [http::data $tok] + lappend postResult [http::data $token] } set postResult [list ] - set token [http::geturl $posturl -querychannel $fp] - http::wait $token - set testRes [list [http::status $token] [string length $query] [http::data $token]] + set t [http::geturl $posturl -querychannel $fp] + http::wait $t + set testRes [list [http::status $t] [string length $query] [http::data $t]] + # Now do async - http::cleanup $token + http::cleanup $t close $fp set fp [open $file] - set token [http::geturl $posturl -querychannel $fp -command asyncCB] + set t [http::geturl $posturl -querychannel $fp -command asyncCB] set postResult [list PostStart] - http::wait $token + http::wait $t close $fp - lappend testRes [http::status $token] $postResult -} -cleanup { + + lappend testRes [http::status $t] $postResult removeFile outdata - catch {http::cleanup $token} -} -result {ok 122879 {Got 122880 bytes} ok {PostStart {Got 122880 bytes}}} + set testRes +} {ok 122879 {Got 122880 bytes} ok {PostStart {Got 122880 bytes}}} # On Linux platforms when the client and server are on the same host, the # client is unable to read the server's response one it hits the write error. # The status is "eof". # On Windows, the http::wait procedure gets a "connection reset by peer" error # while reading the reply. -test http-3.12.$ThreadLevel {http::geturl querychannel with aborted request} -setup { +test http-3.12 {http::geturl querychannel with aborted request} {nonPortable} { set query foo=bar set sep "" set i 0 @@ -327,13 +259,13 @@ test http-3.12.$ThreadLevel {http::geturl querychannel with aborted request} -se set sep & } set file [makeFile $query outdata] -} -constraints {nonPortable} -body { set fp [open $file] - proc asyncCB {tok} { + + proc asyncCB {token} { global postResult - lappend postResult [http::data $tok] + lappend postResult [http::data $token] } - proc postProgress {tok x y} { + proc postProgress {token x y} { global postProgress lappend postProgress $y } @@ -341,230 +273,150 @@ test http-3.12.$ThreadLevel {http::geturl querychannel with aborted request} -se # Now do async set postResult [list PostStart] if {[catch { - set token [http::geturl $badposturl -querychannel $fp -command asyncCB \ + set t [http::geturl $badposturl -querychannel $fp -command asyncCB \ -queryprogress postProgress] - http::wait $token - upvar #0 $token state + http::wait $t + upvar #0 $t state } err]} { puts $::errorInfo error $err } - list [http::status $token] [http::code $token] -} -cleanup { + removeFile outdata - catch {http::cleanup $token} -} -result {ok {HTTP/1.0 200 Data follows}} -test http-3.13.$ThreadLevel {http::geturl socket leak test} { + list [http::status $t] [http::code $t] +} {ok {HTTP/1.0 200 Data follows}} +test http-3.13 {http::geturl socket leak test} { set chanCount [llength [file channels]] for {set i 0} {$i < 3} {incr i} { catch {http::geturl $badurl -timeout 5000} } + # No extra channels should be taken expr {[llength [file channels]] == $chanCount} } 1 -test http-3.14.$ThreadLevel "http::geturl $fullurl" -body { +test http-3.14 "http::geturl $fullurl" { set token [http::geturl $fullurl -validate 1] http::code $token -} -cleanup { - catch {http::cleanup $token} -} -result "HTTP/1.0 200 OK" -test http-3.15.$ThreadLevel {http::geturl parse failures} -body { +} "HTTP/1.0 200 OK" +test http-3.15 {http::geturl parse failures} -body { http::geturl "{invalid}:url" } -returnCodes error -result {Unsupported URL: {invalid}:url} -test http-3.16.$ThreadLevel {http::geturl parse failures} -body { +test http-3.16 {http::geturl parse failures} -body { http::geturl http:relative/url } -returnCodes error -result {Unsupported URL: http:relative/url} -test http-3.17.$ThreadLevel {http::geturl parse failures} -body { +test http-3.17 {http::geturl parse failures} -body { http::geturl /absolute/url } -returnCodes error -result {Missing host part: /absolute/url} -test http-3.18.$ThreadLevel {http::geturl parse failures} -body { +test http-3.18 {http::geturl parse failures} -body { http::geturl http://somewhere:123456789/ } -returnCodes error -result {Invalid port number: 123456789} -test http-3.19.$ThreadLevel {http::geturl parse failures} -body { +test http-3.19 {http::geturl parse failures} -body { http::geturl http://{user}@somewhere } -returnCodes error -result {Illegal characters in URL user} -test http-3.20.$ThreadLevel {http::geturl parse failures} -body { +test http-3.20 {http::geturl parse failures} -body { http::geturl http://%user@somewhere } -returnCodes error -result {Illegal encoding character usage "%us" in URL user} -test http-3.21.$ThreadLevel {http::geturl parse failures} -body { +test http-3.21 {http::geturl parse failures} -body { http::geturl http://somewhere/{path} } -returnCodes error -result {Illegal characters in URL path} -test http-3.22.$ThreadLevel {http::geturl parse failures} -body { +test http-3.22 {http::geturl parse failures} -body { http::geturl http://somewhere/%path } -returnCodes error -result {Illegal encoding character usage "%pa" in URL path} -test http-3.23.$ThreadLevel {http::geturl parse failures} -body { - http::geturl http://somewhere/path?{query}? +test http-3.23 {http::geturl parse failures} -body { + http::geturl http://somewhere/path?{query} } -returnCodes error -result {Illegal characters in URL path} -test http-3.24.$ThreadLevel {http::geturl parse failures} -body { +test http-3.24 {http::geturl parse failures} -body { http::geturl http://somewhere/path?%query } -returnCodes error -result {Illegal encoding character usage "%qu" in URL path} -test http-3.25.$ThreadLevel {http::meta} -setup { - unset -nocomplain m token -} -body { - set token [http::geturl $url -timeout 3000] - array set m [http::meta $token] - lsort [array names m] -} -cleanup { - catch {http::cleanup $token} - unset -nocomplain m token -} -result {content-length content-type date} -test http-3.26.$ThreadLevel {http::meta} -setup { - unset -nocomplain m token -} -body { - set token [http::geturl $url -headers {X-Check 1} -timeout 3000] - array set m [http::meta $token] - lsort [array names m] -} -cleanup { - catch {http::cleanup $token} - unset -nocomplain m token -} -result {content-length content-type date x-check} -test http-3.27.$ThreadLevel {http::geturl: -headers override -type} -body { +test http-3.25 {http::geturl: -headers override -type} -body { set token [http::geturl $url/headers -type "text/plain" -query dummy \ -headers [list "Content-Type" "text/plain;charset=utf-8"]] http::data $token } -cleanup { - catch {http::cleanup $token} -} -match regexp -result {(?n)Host .* + http::cleanup $token +} -match regexp -result {(?n)Accept \*/\* +Host .* User-Agent .* -Content-Type {text/plain;charset=utf-8} -Accept \*/\* -Accept-Encoding .* Connection close +Content-Type {text/plain;charset=utf-8} Content-Length 5} -test http-3.28.$ThreadLevel {http::geturl: -headers override -type default} -body { +test http-3.26 {http::geturl: -headers override -type default} -body { set token [http::geturl $url/headers -query dummy \ -headers [list "Content-Type" "text/plain;charset=utf-8"]] http::data $token } -cleanup { - catch {http::cleanup $token} -} -match regexp -result {(?n)Host .* + http::cleanup $token +} -match regexp -result {(?n)Accept \*/\* +Host .* User-Agent .* -Content-Type {text/plain;charset=utf-8} -Accept \*/\* -Accept-Encoding .* Connection close +Content-Type {text/plain;charset=utf-8} Content-Length 5} -test http-3.29.$ThreadLevel {http::geturl IPv6 address} -body { - # We only want to see if the URL gets parsed correctly. This is - # the case if http::geturl succeeds or returns a socket related - # error. If the parsing is wrong, we'll get a parse error. - # It'd be better to separate the URL parser from http::geturl, so - # that it can be tested without also trying to make a connection. - set error [catch {http::geturl $ipv6url -validate 1} token] - if {$error && [string match "couldn't open socket: *" $token]} { - set error 0 - } - set error -} -cleanup { - catch {http::cleanup $token} -} -result 0 -test http-3.30.$ThreadLevel {http::geturl query without path} -body { +test http-3.30 {http::geturl query without path} -body { set token [http::geturl $authorityurl?var=val] http::ncode $token } -cleanup { - catch {http::cleanup $token} + catch { http::cleanup $token } } -result 200 -test http-3.31.$ThreadLevel {http::geturl fragment without path} -body { +test http-3.31 {http::geturl fragment without path} -body { set token [http::geturl "$authorityurl#fragment42"] http::ncode $token } -cleanup { - catch {http::cleanup $token} + catch { http::cleanup $token } } -result 200 -# Bug c11a51c482 -test http-3.32.$ThreadLevel {http::geturl: -headers override -accept default} -body { - set token [http::geturl $url/headers -query dummy \ - -headers [list "Accept" "text/plain,application/tcl-test-value"]] - http::data $token -} -cleanup { - catch {http::cleanup $token} -} -match regexp -result {(?n)Host .* -User-Agent .* -Accept text/plain,application/tcl-test-value -Accept-Encoding .* -Connection close -Content-Type application/x-www-form-urlencoded -Content-Length 5} -# Bug 838e99a76d -test http-3.33.$ThreadLevel {http::geturl application/xml is text} -body { - set token [http::geturl "$xmlurl"] - scan [http::data $token] "<%\[^>]>%c<%\[^>]>" -} -cleanup { - catch {http::cleanup $token} -} -result {test 4660 /test} -test http-3.34.$ThreadLevel {http::geturl -headers not a list} -returnCodes error -body { - http::geturl http://test/t -headers \" -} -result "Bad value for -headers (\"), must be list" -test http-3.35.$ThreadLevel {http::geturl -headers not even number of elements} -returnCodes error -body { - http::geturl http://test/t -headers {List Length 3} -} -result {Bad value for -headers (List Length 3), number of list elements must be even} -test http-4.1.$ThreadLevel {http::Event} -body { +test http-4.1 {http::Event} { set token [http::geturl $url -keepalive 0] upvar #0 $token data array set meta $data(meta) - expr {($data(totalsize) == $meta(content-length))} -} -cleanup { - catch {http::cleanup $token} -} -result 1 -test http-4.2.$ThreadLevel {http::Event} -body { + expr {($data(totalsize) == $meta(Content-Length))} +} 1 +test http-4.2 {http::Event} { set token [http::geturl $url] upvar #0 $token data array set meta $data(meta) - string compare $data(type) [string trim $meta(content-type)] -} -cleanup { - catch {http::cleanup $token} -} -result 0 -test http-4.3.$ThreadLevel {http::Event} -body { + string compare $data(type) [string trim $meta(Content-Type)] +} 0 +test http-4.3 {http::Event} { set token [http::geturl $url] http::code $token -} -cleanup { - catch {http::cleanup $token} -} -result {HTTP/1.0 200 Data follows} -test http-4.4.$ThreadLevel {http::Event} -setup { +} {HTTP/1.0 200 Data follows} +test http-4.4 {http::Event} { set testfile [makeFile "" testfile] -} -body { set out [open $testfile w] set token [http::geturl $url -channel $out] close $out set in [open $testfile] set x [read $in] -} -cleanup { - catch {close $in} - catch {close $out} + close $in removeFile $testfile - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> + set x +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET $tail</h2> </body></html>" -test http-4.5.$ThreadLevel {http::Event} -setup { +test http-4.5 {http::Event} { set testfile [makeFile "" testfile] -} -body { set out [open $testfile w] fconfigure $out -translation lf set token [http::geturl $url -channel $out] close $out upvar #0 $token data - expr {$data(currentsize) == $data(totalsize)} -} -cleanup { removeFile $testfile - catch {http::cleanup $token} -} -result 1 -test http-4.6.$ThreadLevel {http::Event} -setup { + expr {$data(currentsize) == $data(totalsize)} +} 1 +test http-4.6 {http::Event} { set testfile [makeFile "" testfile] -} -body { set out [open $testfile w] set token [http::geturl $binurl -channel $out] close $out set in [open $testfile] fconfigure $in -translation binary - read $in -} -cleanup { - catch {close $in} - catch {close $out} + set x [read $in] + close $in removeFile $testfile - catch {http::cleanup $token} -} -result "$bindata[string trimleft $binurl /]" + set x +} "$bindata[string trimleft $binurl /]" proc myProgress {token total current} { global progress httpLog if {[info exists httpLog] && $httpLog} { @@ -572,637 +424,137 @@ proc myProgress {token total current} { } set progress [list $total $current] } -test http-4.6.1.$ThreadLevel {http::Event} knownBug { - set token [http::geturl $url -blocksize 50 -progress myProgress] - return $progress -} {111 111} -test http-4.7.$ThreadLevel {http::Event} -body { +if 0 { + # This test hangs on Windows95 because the client never gets EOF + set httpLog 1 + test http-4.6.1 {http::Event} knownBug { + set token [http::geturl $url -blocksize 50 -progress myProgress] + set progress + } {111 111} +} +test http-4.7 {http::Event} { set token [http::geturl $url -keepalive 0 -progress myProgress] - return $progress -} -cleanup { - catch {http::cleanup $token} -} -result {111 111} -test http-4.8.$ThreadLevel {http::Event} -body { + set progress +} {111 111} +test http-4.8 {http::Event} { set token [http::geturl $url] http::status $token -} -cleanup { - catch {http::cleanup $token} -} -result {ok} -test http-4.9.$ThreadLevel {http::Event} -body { +} {ok} +test http-4.9 {http::Event} { set token [http::geturl $url -progress myProgress] http::code $token -} -cleanup { - catch {http::cleanup $token} -} -result {HTTP/1.0 200 Data follows} -test http-4.10.$ThreadLevel {http::Event} -body { +} {HTTP/1.0 200 Data follows} +test http-4.10 {http::Event} { set token [http::geturl $url -progress myProgress] http::size $token -} -cleanup { - catch {http::cleanup $token} -} -result {111} - +} {111} # Timeout cases # Short timeout to working server (the test server). This lets us try a # reset during the connection. -test http-4.11.$ThreadLevel {http::Event} -body { - set token [http::geturl $url -timeout 1 -keepalive 0 -command \#] +test http-4.11 {http::Event} { + set token [http::geturl $url -timeout 1 -keepalive 0 -command {#}] http::reset $token http::status $token -} -cleanup { - catch {http::cleanup $token} -} -result {reset} - +} {reset} # Longer timeout with reset. -test http-4.12.$ThreadLevel {http::Event} -body { - set token [http::geturl $url/?timeout=10 -keepalive 0 -command \#] +test http-4.12 {http::Event} { + set token [http::geturl $url/?timeout=10 -keepalive 0 -command {#}] http::reset $token http::status $token -} -cleanup { - catch {http::cleanup $token} -} -result {reset} - +} {reset} # Medium timeout to working server that waits even longer. The timeout # hits while waiting for a reply. -test http-4.13.$ThreadLevel {http::Event} -body { - set token [http::geturl $url?timeout=30 -keepalive 0 -timeout 10 -command \#] +test http-4.13 {http::Event} { + set token [http::geturl $url?timeout=30 -keepalive 0 -timeout 10 -command {#}] http::wait $token http::status $token -} -cleanup { - catch {http::cleanup $token} -} -result {timeout} - +} {timeout} # Longer timeout to good host, bad port, gets an error after the # connection "completes" but the socket is bad. -test http-4.14.$ThreadLevel {http::Event} -body { +test http-4.14 {http::Event} -body { set token [http::geturl $badurl/?timeout=10 -timeout 10000 -command \#] if {$token eq ""} { error "bogus return from http::geturl" } http::wait $token lindex [http::error $token] 0 -} -cleanup { - catch {http::cleanup $token} -} -result {connect failed: connection refused} - +} -result {connect failed connection refused} # Bogus host -test http-4.15.$ThreadLevel {http::Event} -body { - # 1. The test assumes that http is not using a proxy server. - # If http is using a proxy server, the latter is responsible for the DNS - # lookup of the non-existent host. Squid responds with - # "503 Service Unavailable" and an explanatory response body; but other - # proxies may respond differently. - # 2. The [socket] command blocks during the DNS lookup. - # - When [socket] runs in the main thread (i.e. when -threadlevel is 0 or - # (if Thread package not available) 1), the script cannot time out - # during a prolonged DNS lookup. - # - When [socket] runs in a separate thread (i.e. when the Thread package - # is available and [http::config -threadlevel] is 1 or 2), the main - # thread enters the event loop and has the opportunity to time out - # during the DNS lookup. This causes the test to fail. - # - The test uses a long -timeout so that it is not confounded by a slow - # DNS lookup. - # - If the error result is "timeout", this suggests a problem with - # negative DNS lookups on the test host. Compare the timings for - # different values of threadLevel. - # set t0 [clock milliseconds] - set token [http::geturl //not-a-host.nodns. -timeout 30000 -command \#] +test http-4.15 {http::Event} -body { + # This test may fail if you use a proxy server. That is to be + # expected and is not a problem with Tcl. + set token [http::geturl //not_a_host.tcl.tk -timeout 1000 -command \#] http::wait $token - # set t1 [clock milliseconds] - # puts "Test http-4.15.$ThreadLevel - time taken: [expr {$t1 - $t0}] ms" - set result "[http::status $token] -- [lindex [http::error $token] 0]" + http::status $token # error codes vary among platforms. -} -cleanup { - catch {http::cleanup $token} -} -match glob -result "error -- couldn't open socket*" +} -returnCodes 1 -match glob -result "couldn't open socket*" -test http-4.16.$ThreadLevel {Leak with Close vs Keepalive (bug [6ca52aec14]} -setup { - proc list-difference {l1 l2} { - lmap item $l2 {if {$item in $l1} continue; set item} - } -} -body { - set before [chan names] - set token [http::geturl $url -headers {X-Connection keep-alive}] - http::cleanup $token - update - # Compute what channels have been unexpectedly leaked past cleanup - list-difference $before [chan names] -} -cleanup { - rename list-difference {} -} -result {} - -test http-5.1.$ThreadLevel {http::formatQuery} { +test http-5.1 {http::formatQuery} { http::formatQuery name1 value1 name2 "value two" } {name1=value1&name2=value%20two} # test http-5.2 obsoleted by 5.4 and 5.5 with http 2.5 -test http-5.3.$ThreadLevel {http::formatQuery} { +test http-5.3 {http::formatQuery} { http::formatQuery lines "line1\nline2\nline3" } {lines=line1%0D%0Aline2%0D%0Aline3} -test http-5.4.$ThreadLevel {http::formatQuery} { - http::formatQuery name1 ~bwelch name2 ¡¢¢ +test http-5.4 {http::formatQuery} { + http::formatQuery name1 ~bwelch name2 \xa1\xa2\xa2 } {name1=~bwelch&name2=%C2%A1%C2%A2%C2%A2} -test http-5.5.$ThreadLevel {http::formatQuery} { +test http-5.5 {http::formatQuery} { set enc [http::config -urlencoding] http::config -urlencoding iso8859-1 - set res [http::formatQuery name1 ~bwelch name2 ¡¢¢] + set res [http::formatQuery name1 ~bwelch name2 \xa1\xa2\xa2] http::config -urlencoding $enc set res } {name1=~bwelch&name2=%A1%A2%A2} -test http-6.1.$ThreadLevel {http::ProxyRequired} -body { - http::config -proxyhost ${::HOST} -proxyport $port +test http-6.1 {http::ProxyRequired} { + http::config -proxyhost [info hostname] -proxyport $port set token [http::geturl $url] http::wait $token + http::config -proxyhost {} -proxyport {} upvar #0 $token data set data(body) -} -cleanup { - http::config -proxyhost {} -proxyport {} - catch {http::cleanup $token} -} -result "<html><head><title>HTTP/1.0 TEST</title></head><body> +} "<html><head><title>HTTP/1.0 TEST</title></head><body> <h1>Hello, World!</h1> <h2>GET http:$url</h2> </body></html>" -test http-7.1.$ThreadLevel {http::mapReply} { +test http-7.1 {http::mapReply} { http::mapReply "abc\$\[\]\"\\()\}\{" } {abc%24%5B%5D%22%5C%28%29%7D%7B} -test http-7.2.$ThreadLevel {http::mapReply} { +test http-7.2 {http::mapReply} { # RFC 2718 specifies that we pass urlencoding on utf-8 chars by default, # so make sure this gets converted to utf-8 then urlencoded. - http::mapReply "∈" + http::mapReply "\u2208" } {%E2%88%88} -test http-7.3.$ThreadLevel {http::formatQuery} -setup { +test http-7.3 {http::formatQuery} { set enc [http::config -urlencoding] -} -returnCodes error -body { - # -urlencoding "" no longer supported. Use "iso8859-1". + # this would be reverting to http <=2.4 behavior http::config -urlencoding "" - http::mapReply "∈" -} -cleanup { + set res [list [catch {http::mapReply "\u2208"} msg] $msg] http::config -urlencoding $enc -} -result {unknown encoding ""} -test http-7.4.$ThreadLevel {http::formatQuery} -constraints deprecated -setup { + set res +} [list 1 "can't read \"formMap(\u2208)\": no such element in array"] +test http-7.4 {http::formatQuery} { set enc [http::config -urlencoding] -} -body { # this would be reverting to http <=2.4 behavior w/o errors - # with Tcl 8.x (unknown chars become '?'), generating a - # proper exception with Tcl 9.0 + # (unknown chars become '?') http::config -urlencoding "iso8859-1" - http::mapReply "∈" -} -cleanup { + set res [http::mapReply "\u2208"] http::config -urlencoding $enc -} -result {%3F} - -package require tcl::idna 1.0 - -test http-idna-1.1.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna -} -result {wrong # args: should be "::tcl::idna subcommand ?arg ...?"} -test http-idna-1.2.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna ? -} -result {unknown or ambiguous subcommand "?": must be decode, encode, puny, or version} -test http-idna-1.3.$ThreadLevel {IDNA package: basics} -body { - ::tcl::idna version -} -result 1.0.1 -test http-idna-1.4.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna version what -} -result {wrong # args: should be "::tcl::idna version"} -test http-idna-1.5.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna puny -} -result {wrong # args: should be "::tcl::idna puny subcommand ?arg ...?"} -test http-idna-1.6.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna puny ? -} -result {unknown or ambiguous subcommand "?": must be decode, or encode} -test http-idna-1.7.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna puny encode -} -result {wrong # args: should be "::tcl::idna puny encode string ?case?"} -test http-idna-1.8.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna puny encode a b c -} -result {wrong # args: should be "::tcl::idna puny encode string ?case?"} -test http-idna-1.9.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna puny decode -} -result {wrong # args: should be "::tcl::idna puny decode string ?case?"} -test http-idna-1.10.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna puny decode a b c -} -result {wrong # args: should be "::tcl::idna puny decode string ?case?"} -test http-idna-1.11.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna decode -} -result {wrong # args: should be "::tcl::idna decode hostname"} -test http-idna-1.12.$ThreadLevel {IDNA package: basics} -returnCodes error -body { - ::tcl::idna encode -} -result {wrong # args: should be "::tcl::idna encode hostname"} - -test http-idna-2.1.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode abc -} abc- -test http-idna-2.2.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode a€b€c -} abc-k50ab -test http-idna-2.3.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode ABC -} ABC- -test http-idna-2.4.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode A€B€C -} ABC-k50ab -test http-idna-2.5.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode ABC 0 -} abc- -test http-idna-2.6.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode A€B€C 0 -} abc-k50ab -test http-idna-2.7.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode ABC 1 -} ABC- -test http-idna-2.8.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode A€B€C 1 -} ABC-k50ab -test http-idna-2.9.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode abc 0 -} abc- -test http-idna-2.10.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode a€b€c 0 -} abc-k50ab -test http-idna-2.11.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode abc 1 -} ABC- -test http-idna-2.12.$ThreadLevel {puny encode: functional test} { - ::tcl::idna puny encode a€b€c 1 -} ABC-k50ab -test http-idna-2.13.$ThreadLevel {puny encode: edge cases} { - ::tcl::idna puny encode "" -} "" -test http-idna-2.14-A.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+0644 u+064A u+0647 u+0645 u+0627 u+0628 u+062A u+0643 u+0644 - u+0645 u+0648 u+0634 u+0639 u+0631 u+0628 u+064A u+061F - }]] ""] -} egbpdaj6bu4bxfgehfvwxn -test http-idna-2.14-B.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+4ED6 u+4EEC u+4E3A u+4EC0 u+4E48 u+4E0D u+8BF4 u+4E2D u+6587 - }]] ""] -} ihqwcrb4cv8a8dqg056pqjye -test http-idna-2.14-C.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+4ED6 u+5011 u+7232 u+4EC0 u+9EBD u+4E0D u+8AAA u+4E2D u+6587 - }]] ""] -} ihqwctvzc91f659drss3x8bo0yb -test http-idna-2.14-D.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+0050 u+0072 u+006F u+010D u+0070 u+0072 u+006F u+0073 u+0074 - u+011B u+006E u+0065 u+006D u+006C u+0075 u+0076 u+00ED u+010D - u+0065 u+0073 u+006B u+0079 - }]] ""] -} Proprostnemluvesky-uyb24dma41a -test http-idna-2.14-E.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+05DC u+05DE u+05D4 u+05D4 u+05DD u+05E4 u+05E9 u+05D5 u+05D8 - u+05DC u+05D0 u+05DE u+05D3 u+05D1 u+05E8 u+05D9 u+05DD u+05E2 - u+05D1 u+05E8 u+05D9 u+05EA - }]] ""] -} 4dbcagdahymbxekheh6e0a7fei0b -test http-idna-2.14-F.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+092F u+0939 u+0932 u+094B u+0917 u+0939 u+093F u+0928 u+094D - u+0926 u+0940 u+0915 u+094D u+092F u+094B u+0902 u+0928 u+0939 - u+0940 u+0902 u+092C u+094B u+0932 u+0938 u+0915 u+0924 u+0947 - u+0939 u+0948 u+0902 - }]] ""] -} i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd -test http-idna-2.14-G.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+306A u+305C u+307F u+3093 u+306A u+65E5 u+672C u+8A9E u+3092 - u+8A71 u+3057 u+3066 u+304F u+308C u+306A u+3044 u+306E u+304B - }]] ""] -} n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa -test http-idna-2.14-H.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+C138 u+ACC4 u+C758 u+BAA8 u+B4E0 u+C0AC u+B78C u+B4E4 u+C774 - u+D55C u+AD6D u+C5B4 u+B97C u+C774 u+D574 u+D55C u+B2E4 u+BA74 - u+C5BC u+B9C8 u+B098 u+C88B u+C744 u+AE4C - }]] ""] -} 989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c -test http-idna-2.14-I.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+043F u+043E u+0447 u+0435 u+043C u+0443 u+0436 u+0435 u+043E - u+043D u+0438 u+043D u+0435 u+0433 u+043E u+0432 u+043E u+0440 - u+044F u+0442 u+043F u+043E u+0440 u+0443 u+0441 u+0441 u+043A - u+0438 - }]] ""] -} b1abfaaepdrnnbgefbadotcwatmq2g4l -test http-idna-2.14-J.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+0050 u+006F u+0072 u+0071 u+0075 u+00E9 u+006E u+006F u+0070 - u+0075 u+0065 u+0064 u+0065 u+006E u+0073 u+0069 u+006D u+0070 - u+006C u+0065 u+006D u+0065 u+006E u+0074 u+0065 u+0068 u+0061 - u+0062 u+006C u+0061 u+0072 u+0065 u+006E u+0045 u+0073 u+0070 - u+0061 u+00F1 u+006F u+006C - }]] ""] -} PorqunopuedensimplementehablarenEspaol-fmd56a -test http-idna-2.14-K.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+0054 u+1EA1 u+0069 u+0073 u+0061 u+006F u+0068 u+1ECD u+006B - u+0068 u+00F4 u+006E u+0067 u+0074 u+0068 u+1EC3 u+0063 u+0068 - u+1EC9 u+006E u+00F3 u+0069 u+0074 u+0069 u+1EBF u+006E u+0067 - u+0056 u+0069 u+1EC7 u+0074 - }]] ""] -} TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g -test http-idna-2.14-L.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+0033 u+5E74 u+0042 u+7D44 u+91D1 u+516B u+5148 u+751F - }]] ""] -} 3B-ww4c5e180e575a65lsy2b -test http-idna-2.14-M.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+5B89 u+5BA4 u+5948 u+7F8E u+6075 u+002D u+0077 u+0069 u+0074 - u+0068 u+002D u+0053 u+0055 u+0050 u+0045 u+0052 u+002D u+004D - u+004F u+004E u+004B u+0045 u+0059 u+0053 - }]] ""] -} -with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n -test http-idna-2.14-N.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+0048 u+0065 u+006C u+006C u+006F u+002D u+0041 u+006E u+006F - u+0074 u+0068 u+0065 u+0072 u+002D u+0057 u+0061 u+0079 u+002D - u+305D u+308C u+305E u+308C u+306E u+5834 u+6240 - }]] ""] -} Hello-Another-Way--fc4qua05auwb3674vfr0b -test http-idna-2.14-O.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+3072 u+3068 u+3064 u+5C4B u+6839 u+306E u+4E0B u+0032 - }]] ""] -} 2-u9tlzr9756bt3uc0v -test http-idna-2.14-P.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+004D u+0061 u+006A u+0069 u+3067 u+004B u+006F u+0069 u+3059 - u+308B u+0035 u+79D2 u+524D - }]] ""] -} MajiKoi5-783gue6qz075azm5e -test http-idna-2.14-Q.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+30D1 u+30D5 u+30A3 u+30FC u+0064 u+0065 u+30EB u+30F3 u+30D0 - }]] ""] -} de-jg4avhby1noc0d -test http-idna-2.14-R.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode [join [subst [string map {u+ \\u} { - u+305D u+306E u+30B9 u+30D4 u+30FC u+30C9 u+3067 - }]] ""] -} d9juau41awczczp -test http-idna-2.14-S.$ThreadLevel {puny encode: examples from RFC 3492} { - ::tcl::idna puny encode {-> $1.00 <-} -} {-> $1.00 <--} - -test http-idna-3.1.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc- -} abc -test http-idna-3.2.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc-k50ab -} a€b€c -test http-idna-3.3.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC- -} ABC -test http-idna-3.4.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC-k50ab -} A€B€C -test http-idna-3.5.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC-K50AB -} A€B€C -test http-idna-3.6.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc-K50AB -} a€b€c -test http-idna-3.7.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC- 0 -} abc -test http-idna-3.8.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC-K50AB 0 -} a€b€c -test http-idna-3.9.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC- 1 -} ABC -test http-idna-3.10.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode ABC-K50AB 1 -} A€B€C -test http-idna-3.11.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc- 0 -} abc -test http-idna-3.12.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc-k50ab 0 -} a€b€c -test http-idna-3.13.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc- 1 -} ABC -test http-idna-3.14.$ThreadLevel {puny decode: functional test} { - ::tcl::idna puny decode abc-k50ab 1 -} A€B€C -test http-idna-3.15.$ThreadLevel {puny decode: edge cases and errors} { - # Is this case actually correct? - binary encode hex [encoding convertto utf-8 [::tcl::idna puny decode abc]] -} c282c281c280 -test http-idna-3.16.$ThreadLevel {puny decode: edge cases and errors} -returnCodes error -body { - ::tcl::idna puny decode abc! -} -result {bad decode character "!"} -test http-idna-3.17.$ThreadLevel {puny decode: edge cases and errors} { - catch {::tcl::idna puny decode abc!} -> opt - dict get $opt -errorcode -} {PUNYCODE BAD_INPUT CHAR} -test http-idna-3.18.$ThreadLevel {puny decode: edge cases and errors} { - ::tcl::idna puny decode "" -} {} -# A helper so we don't get lots of crap in failures -proc hexify s {lmap c [split $s ""] {format u+%04X [scan $c %c]}} -test http-idna-3.19-A.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode egbpdaj6bu4bxfgehfvwxn] -} [list {*}{ - u+0644 u+064A u+0647 u+0645 u+0627 u+0628 u+062A u+0643 u+0644 - u+0645 u+0648 u+0634 u+0639 u+0631 u+0628 u+064A u+061F -}] -test http-idna-3.19-B.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode ihqwcrb4cv8a8dqg056pqjye] -} {u+4ED6 u+4EEC u+4E3A u+4EC0 u+4E48 u+4E0D u+8BF4 u+4E2D u+6587} -test http-idna-3.19-C.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode ihqwctvzc91f659drss3x8bo0yb] -} {u+4ED6 u+5011 u+7232 u+4EC0 u+9EBD u+4E0D u+8AAA u+4E2D u+6587} -test http-idna-3.19-D.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode Proprostnemluvesky-uyb24dma41a] -} [list {*}{ - u+0050 u+0072 u+006F u+010D u+0070 u+0072 u+006F u+0073 u+0074 - u+011B u+006E u+0065 u+006D u+006C u+0075 u+0076 u+00ED u+010D - u+0065 u+0073 u+006B u+0079 -}] -test http-idna-3.19-E.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode 4dbcagdahymbxekheh6e0a7fei0b] -} [list {*}{ - u+05DC u+05DE u+05D4 u+05D4 u+05DD u+05E4 u+05E9 u+05D5 u+05D8 - u+05DC u+05D0 u+05DE u+05D3 u+05D1 u+05E8 u+05D9 u+05DD u+05E2 - u+05D1 u+05E8 u+05D9 u+05EA -}] -test http-idna-3.19-F.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode \ - i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd] -} [list {*}{ - u+092F u+0939 u+0932 u+094B u+0917 u+0939 u+093F u+0928 u+094D - u+0926 u+0940 u+0915 u+094D u+092F u+094B u+0902 u+0928 u+0939 - u+0940 u+0902 u+092C u+094B u+0932 u+0938 u+0915 u+0924 u+0947 - u+0939 u+0948 u+0902 -}] -test http-idna-3.19-G.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa] -} [list {*}{ - u+306A u+305C u+307F u+3093 u+306A u+65E5 u+672C u+8A9E u+3092 - u+8A71 u+3057 u+3066 u+304F u+308C u+306A u+3044 u+306E u+304B -}] -test http-idna-3.19-H.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode \ - 989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c] -} [list {*}{ - u+C138 u+ACC4 u+C758 u+BAA8 u+B4E0 u+C0AC u+B78C u+B4E4 u+C774 - u+D55C u+AD6D u+C5B4 u+B97C u+C774 u+D574 u+D55C u+B2E4 u+BA74 - u+C5BC u+B9C8 u+B098 u+C88B u+C744 u+AE4C -}] -test http-idna-3.19-I.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode b1abfaaepdrnnbgefbadotcwatmq2g4l] -} [list {*}{ - u+043F u+043E u+0447 u+0435 u+043C u+0443 u+0436 u+0435 u+043E - u+043D u+0438 u+043D u+0435 u+0433 u+043E u+0432 u+043E u+0440 - u+044F u+0442 u+043F u+043E u+0440 u+0443 u+0441 u+0441 u+043A - u+0438 -}] -test http-idna-3.19-J.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode \ - PorqunopuedensimplementehablarenEspaol-fmd56a] -} [list {*}{ - u+0050 u+006F u+0072 u+0071 u+0075 u+00E9 u+006E u+006F u+0070 - u+0075 u+0065 u+0064 u+0065 u+006E u+0073 u+0069 u+006D u+0070 - u+006C u+0065 u+006D u+0065 u+006E u+0074 u+0065 u+0068 u+0061 - u+0062 u+006C u+0061 u+0072 u+0065 u+006E u+0045 u+0073 u+0070 - u+0061 u+00F1 u+006F u+006C -}] -test http-idna-3.19-K.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode \ - TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g] -} [list {*}{ - u+0054 u+1EA1 u+0069 u+0073 u+0061 u+006F u+0068 u+1ECD u+006B - u+0068 u+00F4 u+006E u+0067 u+0074 u+0068 u+1EC3 u+0063 u+0068 - u+1EC9 u+006E u+00F3 u+0069 u+0074 u+0069 u+1EBF u+006E u+0067 - u+0056 u+0069 u+1EC7 u+0074 -}] -test http-idna-3.19-L.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode 3B-ww4c5e180e575a65lsy2b] -} {u+0033 u+5E74 u+0042 u+7D44 u+91D1 u+516B u+5148 u+751F} -test http-idna-3.19-M.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode -with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n] -} [list {*}{ - u+5B89 u+5BA4 u+5948 u+7F8E u+6075 u+002D u+0077 u+0069 u+0074 - u+0068 u+002D u+0053 u+0055 u+0050 u+0045 u+0052 u+002D u+004D - u+004F u+004E u+004B u+0045 u+0059 u+0053 -}] -test http-idna-3.19-N.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode Hello-Another-Way--fc4qua05auwb3674vfr0b] -} [list {*}{ - u+0048 u+0065 u+006C u+006C u+006F u+002D u+0041 u+006E u+006F - u+0074 u+0068 u+0065 u+0072 u+002D u+0057 u+0061 u+0079 u+002D - u+305D u+308C u+305E u+308C u+306E u+5834 u+6240 -}] -test http-idna-3.19-O.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode 2-u9tlzr9756bt3uc0v] -} {u+3072 u+3068 u+3064 u+5C4B u+6839 u+306E u+4E0B u+0032} -test http-idna-3.19-P.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode MajiKoi5-783gue6qz075azm5e] -} [list {*}{ - u+004D u+0061 u+006A u+0069 u+3067 u+004B u+006F u+0069 u+3059 - u+308B u+0035 u+79D2 u+524D -}] -test http-idna-3.19-Q.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode de-jg4avhby1noc0d] -} {u+30D1 u+30D5 u+30A3 u+30FC u+0064 u+0065 u+30EB u+30F3 u+30D0} -test http-idna-3.19-R.$ThreadLevel {puny decode: examples from RFC 3492} { - hexify [::tcl::idna puny decode d9juau41awczczp] -} {u+305D u+306E u+30B9 u+30D4 u+30FC u+30C9 u+3067} -test http-idna-3.19-S.$ThreadLevel {puny decode: examples from RFC 3492} { - ::tcl::idna puny decode {-> $1.00 <--} -} {-> $1.00 <-} -rename hexify "" - -test http-idna-4.1.$ThreadLevel {IDNA encoding} { - ::tcl::idna encode abc.def -} abc.def -test http-idna-4.2.$ThreadLevel {IDNA encoding} { - ::tcl::idna encode a€b€c.def -} xn--abc-k50ab.def -test http-idna-4.3.$ThreadLevel {IDNA encoding} { - ::tcl::idna encode def.a€b€c -} def.xn--abc-k50ab -test http-idna-4.4.$ThreadLevel {IDNA encoding} { - ::tcl::idna encode ABC.DEF -} ABC.DEF -test http-idna-4.5.$ThreadLevel {IDNA encoding} { - ::tcl::idna encode A€B€C.def -} xn--ABC-k50ab.def -test http-idna-4.6.$ThreadLevel {IDNA encoding: invalid edge case} { - # Should this be an error? - ::tcl::idna encode abc..def -} abc..def -test http-idna-4.7.$ThreadLevel {IDNA encoding: invalid char} -returnCodes error -body { - ::tcl::idna encode abc.$.def -} -result {bad character "$" in DNS name} -test http-idna-4.7.1.$ThreadLevel {IDNA encoding: invalid char} { - catch {::tcl::idna encode abc.$.def} -> opt - dict get $opt -errorcode -} {IDNA INVALID_NAME_CHARACTER {$}} -test http-idna-4.8.$ThreadLevel {IDNA encoding: empty} { - ::tcl::idna encode "" -} {} -set overlong www.[join [subst [string map {u+ \\u} { - u+C138 u+ACC4 u+C758 u+BAA8 u+B4E0 u+C0AC u+B78C u+B4E4 u+C774 - u+D55C u+AD6D u+C5B4 u+B97C u+C774 u+D574 u+D55C u+B2E4 u+BA74 - u+C5BC u+B9C8 u+B098 u+C88B u+C744 u+AE4C -}]] ""].com -test http-idna-4.9.$ThreadLevel {IDNA encoding: max lengths from RFC 5890} -body { - ::tcl::idna encode $overlong -} -returnCodes error -result "hostname part too long" -test http-idna-4.9.1.$ThreadLevel {IDNA encoding: max lengths from RFC 5890} { - catch {::tcl::idna encode $overlong} -> opt - dict get $opt -errorcode -} {IDNA OVERLONG_PART xn--989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c} -unset overlong -test http-idna-4.10.$ThreadLevel {IDNA encoding: edge cases} { - ::tcl::idna encode passé.example.com -} xn--pass-epa.example.com + set res +} {%3F} -test http-idna-5.1.$ThreadLevel {IDNA decoding} { - ::tcl::idna decode abc.def -} abc.def -test http-idna-5.2.$ThreadLevel {IDNA decoding} { - # Invalid entry that's just a wrapper - ::tcl::idna decode xn--abc-.def -} abc.def -test http-idna-5.3.$ThreadLevel {IDNA decoding} { - # Invalid entry that's just a wrapper - ::tcl::idna decode xn--abc-.xn--def- -} abc.def -test http-idna-5.4.$ThreadLevel {IDNA decoding} { - # Invalid entry that's just a wrapper - ::tcl::idna decode XN--abc-.XN--def- -} abc.def -test http-idna-5.5.$ThreadLevel {IDNA decoding: error cases} -returnCodes error -body { - ::tcl::idna decode xn--$$$.example.com -} -result {bad decode character "$"} -test http-idna-5.5.1.$ThreadLevel {IDNA decoding: error cases} { - catch {::tcl::idna decode xn--$$$.example.com} -> opt - dict get $opt -errorcode -} {PUNYCODE BAD_INPUT CHAR} -test http-idna-5.6.$ThreadLevel {IDNA decoding: error cases} -returnCodes error -body { - ::tcl::idna decode xn--a-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz.def -} -result {exceeded input data} -test http-idna-5.6.1.$ThreadLevel {IDNA decoding: error cases} { - catch {::tcl::idna decode xn--a-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz.def} -> opt - dict get $opt -errorcode -} {PUNYCODE BAD_INPUT LENGTH} - # cleanup catch {unset url} catch {unset badurl} catch {unset port} catch {unset data} -if {[llength $threadStack]} { - eval [lpop threadStack] +if {[info exists httpthread]} { + testthread send -async $httpthread { + testthread exit + } + testthread join $httpthread } else { close $listen } @@ -1212,11 +564,4 @@ if {[info exists removeHttpd]} { } rename bgerror {} - -if {[testConstraint ThreadLevelSummary]} { - ::tcltest::cleanupTests -} - -# Local variables: -# mode: tcl -# End: +::tcltest::cleanupTests |
