[25] | 1 | # Commands covered: http::config, http::geturl, http::wait, http::reset |
---|
| 2 | # |
---|
| 3 | # This file contains a collection of tests for the http script library. |
---|
| 4 | # Sourcing this file into Tcl runs the tests and |
---|
| 5 | # generates output for errors. No output means no errors were found. |
---|
| 6 | # |
---|
| 7 | # Copyright (c) 1991-1993 The Regents of the University of California. |
---|
| 8 | # Copyright (c) 1994-1996 Sun Microsystems, Inc. |
---|
| 9 | # Copyright (c) 1998-2000 by Ajuba Solutions. |
---|
| 10 | # |
---|
| 11 | # See the file "license.terms" for information on usage and redistribution |
---|
| 12 | # of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
---|
| 13 | # |
---|
| 14 | # |
---|
| 15 | # RCS: @(#) $Id: http.test,v 1.48 2008/03/12 09:51:39 hobbs Exp $ |
---|
| 16 | |
---|
| 17 | if {[lsearch [namespace children] ::tcltest] == -1} { |
---|
| 18 | package require tcltest 2 |
---|
| 19 | namespace import -force ::tcltest::* |
---|
| 20 | } |
---|
| 21 | |
---|
| 22 | if {[catch {package require http 2} version]} { |
---|
| 23 | if {[info exists http2]} { |
---|
| 24 | catch {puts "Cannot load http 2.* package"} |
---|
| 25 | return |
---|
| 26 | } else { |
---|
| 27 | catch {puts "Running http 2.* tests in slave interp"} |
---|
| 28 | set interp [interp create http2] |
---|
| 29 | $interp eval [list set http2 "running"] |
---|
| 30 | $interp eval [list set argv $argv] |
---|
| 31 | $interp eval [list source [info script]] |
---|
| 32 | interp delete $interp |
---|
| 33 | return |
---|
| 34 | } |
---|
| 35 | } |
---|
| 36 | |
---|
| 37 | proc bgerror {args} { |
---|
| 38 | global errorInfo |
---|
| 39 | puts stderr "http.test bgerror" |
---|
| 40 | puts stderr [join $args] |
---|
| 41 | puts stderr $errorInfo |
---|
| 42 | } |
---|
| 43 | |
---|
| 44 | set port 8010 |
---|
| 45 | set bindata "This is binary data\x0d\x0amore\x0dmore\x0amore\x00null" |
---|
| 46 | catch {unset data} |
---|
| 47 | |
---|
| 48 | # Ensure httpd file exists |
---|
| 49 | |
---|
| 50 | set origFile [file join [pwd] [file dirname [info script]] httpd] |
---|
| 51 | set httpdFile [file join [temporaryDirectory] httpd_[pid]] |
---|
| 52 | if {![file exists $httpdFile]} { |
---|
| 53 | makeFile "" $httpdFile |
---|
| 54 | file delete $httpdFile |
---|
| 55 | file copy $origFile $httpdFile |
---|
| 56 | set removeHttpd 1 |
---|
| 57 | } |
---|
| 58 | |
---|
| 59 | if {[info commands testthread] == "testthread" && [file exists $httpdFile]} { |
---|
| 60 | set httpthread [testthread create " |
---|
| 61 | source [list $httpdFile] |
---|
| 62 | testthread wait |
---|
| 63 | "] |
---|
| 64 | testthread send $httpthread [list set port $port] |
---|
| 65 | testthread send $httpthread [list set bindata $bindata] |
---|
| 66 | testthread send $httpthread {httpd_init $port} |
---|
| 67 | puts "Running httpd in thread $httpthread" |
---|
| 68 | } else { |
---|
| 69 | if {![file exists $httpdFile]} { |
---|
| 70 | puts "Cannot read $httpdFile script, http test skipped" |
---|
| 71 | unset port |
---|
| 72 | return |
---|
| 73 | } |
---|
| 74 | source $httpdFile |
---|
| 75 | # Let the OS pick the port; that's much more flexible |
---|
| 76 | if {[catch {httpd_init 0} listen]} { |
---|
| 77 | puts "Cannot start http server, http test skipped" |
---|
| 78 | unset port |
---|
| 79 | return |
---|
| 80 | } else { |
---|
| 81 | set port [lindex [fconfigure $listen -sockname] 2] |
---|
| 82 | } |
---|
| 83 | } |
---|
| 84 | |
---|
| 85 | test http-1.1 {http::config} { |
---|
| 86 | http::config |
---|
| 87 | } [list -accept */* -proxyfilter http::ProxyRequired -proxyhost {} -proxyport {} -urlencoding utf-8 -useragent "Tcl http client package $version"] |
---|
| 88 | test http-1.2 {http::config} { |
---|
| 89 | http::config -proxyfilter |
---|
| 90 | } http::ProxyRequired |
---|
| 91 | test http-1.3 {http::config} { |
---|
| 92 | catch {http::config -junk} |
---|
| 93 | } 1 |
---|
| 94 | test http-1.4 {http::config} { |
---|
| 95 | set savedconf [http::config] |
---|
| 96 | http::config -proxyhost nowhere.come -proxyport 8080 \ |
---|
| 97 | -proxyfilter myFilter -useragent "Tcl Test Suite" \ |
---|
| 98 | -urlencoding iso8859-1 |
---|
| 99 | set x [http::config] |
---|
| 100 | http::config {*}$savedconf |
---|
| 101 | set x |
---|
| 102 | } {-accept */* -proxyfilter myFilter -proxyhost nowhere.come -proxyport 8080 -urlencoding iso8859-1 -useragent {Tcl Test Suite}} |
---|
| 103 | test http-1.5 {http::config} { |
---|
| 104 | list [catch {http::config -proxyhost {} -junk 8080} msg] $msg |
---|
| 105 | } {1 {Unknown option -junk, must be: -accept, -proxyfilter, -proxyhost, -proxyport, -urlencoding, -useragent}} |
---|
| 106 | test http-1.6 {http::config} { |
---|
| 107 | set enc [list [http::config -urlencoding]] |
---|
| 108 | http::config -urlencoding iso8859-1 |
---|
| 109 | lappend enc [http::config -urlencoding] |
---|
| 110 | http::config -urlencoding [lindex $enc 0] |
---|
| 111 | set enc |
---|
| 112 | } {utf-8 iso8859-1} |
---|
| 113 | |
---|
| 114 | test http-2.1 {http::reset} { |
---|
| 115 | catch {http::reset http#1} |
---|
| 116 | } 0 |
---|
| 117 | |
---|
| 118 | test http-3.1 {http::geturl} { |
---|
| 119 | list [catch {http::geturl -bogus flag} msg] $msg |
---|
| 120 | } {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}} |
---|
| 121 | test http-3.2 {http::geturl} { |
---|
| 122 | catch {http::geturl http:junk} err |
---|
| 123 | set err |
---|
| 124 | } {Unsupported URL: http:junk} |
---|
| 125 | set url //[info hostname]:$port |
---|
| 126 | set badurl //[info hostname]:6666 |
---|
| 127 | test http-3.3 {http::geturl} { |
---|
| 128 | set token [http::geturl $url] |
---|
| 129 | http::data $token |
---|
| 130 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 131 | <h1>Hello, World!</h1> |
---|
| 132 | <h2>GET /</h2> |
---|
| 133 | </body></html>" |
---|
| 134 | set tail /a/b/c |
---|
| 135 | set url //[info hostname]:$port/a/b/c |
---|
| 136 | set fullurl http://user:pass@[info hostname]:$port/a/b/c |
---|
| 137 | set binurl //[info hostname]:$port/binary |
---|
| 138 | set posturl //[info hostname]:$port/post |
---|
| 139 | set badposturl //[info hostname]:$port/droppost |
---|
| 140 | test http-3.4 {http::geturl} { |
---|
| 141 | set token [http::geturl $url] |
---|
| 142 | http::data $token |
---|
| 143 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 144 | <h1>Hello, World!</h1> |
---|
| 145 | <h2>GET $tail</h2> |
---|
| 146 | </body></html>" |
---|
| 147 | proc selfproxy {host} { |
---|
| 148 | global port |
---|
| 149 | return [list [info hostname] $port] |
---|
| 150 | } |
---|
| 151 | test http-3.5 {http::geturl} { |
---|
| 152 | http::config -proxyfilter selfproxy |
---|
| 153 | set token [http::geturl $url] |
---|
| 154 | http::config -proxyfilter http::ProxyRequired |
---|
| 155 | http::data $token |
---|
| 156 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 157 | <h1>Hello, World!</h1> |
---|
| 158 | <h2>GET http:$url</h2> |
---|
| 159 | </body></html>" |
---|
| 160 | test http-3.6 {http::geturl} { |
---|
| 161 | http::config -proxyfilter bogus |
---|
| 162 | set token [http::geturl $url] |
---|
| 163 | http::config -proxyfilter http::ProxyRequired |
---|
| 164 | http::data $token |
---|
| 165 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 166 | <h1>Hello, World!</h1> |
---|
| 167 | <h2>GET $tail</h2> |
---|
| 168 | </body></html>" |
---|
| 169 | test http-3.7 {http::geturl} { |
---|
| 170 | set token [http::geturl $url -headers {Pragma no-cache}] |
---|
| 171 | http::data $token |
---|
| 172 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 173 | <h1>Hello, World!</h1> |
---|
| 174 | <h2>GET $tail</h2> |
---|
| 175 | </body></html>" |
---|
| 176 | test http-3.8 {http::geturl} { |
---|
| 177 | set token [http::geturl $url -query Name=Value&Foo=Bar -timeout 2000] |
---|
| 178 | http::data $token |
---|
| 179 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 180 | <h1>Hello, World!</h1> |
---|
| 181 | <h2>POST $tail</h2> |
---|
| 182 | <h2>Query</h2> |
---|
| 183 | <dl> |
---|
| 184 | <dt>Name<dd>Value |
---|
| 185 | <dt>Foo<dd>Bar |
---|
| 186 | </dl> |
---|
| 187 | </body></html>" |
---|
| 188 | test http-3.9 {http::geturl} { |
---|
| 189 | set token [http::geturl $url -validate 1] |
---|
| 190 | http::code $token |
---|
| 191 | } "HTTP/1.0 200 OK" |
---|
| 192 | test http-3.10 {http::geturl queryprogress} { |
---|
| 193 | set query foo=bar |
---|
| 194 | set sep "" |
---|
| 195 | set i 0 |
---|
| 196 | # Create about 120K of query data |
---|
| 197 | while {$i < 14} { |
---|
| 198 | incr i |
---|
| 199 | append query $sep$query |
---|
| 200 | set sep & |
---|
| 201 | } |
---|
| 202 | |
---|
| 203 | proc postProgress {token x y} { |
---|
| 204 | global postProgress |
---|
| 205 | lappend postProgress $y |
---|
| 206 | } |
---|
| 207 | set postProgress {} |
---|
| 208 | set t [http::geturl $posturl -keepalive 0 -query $query \ |
---|
| 209 | -queryprogress postProgress -queryblocksize 16384] |
---|
| 210 | http::wait $t |
---|
| 211 | list [http::status $t] [string length $query] $postProgress [http::data $t] |
---|
| 212 | } {ok 122879 {16384 32768 49152 65536 81920 98304 114688 122879} {Got 122879 bytes}} |
---|
| 213 | test http-3.11 {http::geturl querychannel with -command} { |
---|
| 214 | set query foo=bar |
---|
| 215 | set sep "" |
---|
| 216 | set i 0 |
---|
| 217 | # Create about 120K of query data |
---|
| 218 | while {$i < 14} { |
---|
| 219 | incr i |
---|
| 220 | append query $sep$query |
---|
| 221 | set sep & |
---|
| 222 | } |
---|
| 223 | set file [makeFile $query outdata] |
---|
| 224 | set fp [open $file] |
---|
| 225 | |
---|
| 226 | proc asyncCB {token} { |
---|
| 227 | global postResult |
---|
| 228 | lappend postResult [http::data $token] |
---|
| 229 | } |
---|
| 230 | set postResult [list ] |
---|
| 231 | set t [http::geturl $posturl -querychannel $fp] |
---|
| 232 | http::wait $t |
---|
| 233 | set testRes [list [http::status $t] [string length $query] [http::data $t]] |
---|
| 234 | |
---|
| 235 | # Now do async |
---|
| 236 | http::cleanup $t |
---|
| 237 | close $fp |
---|
| 238 | set fp [open $file] |
---|
| 239 | set t [http::geturl $posturl -querychannel $fp -command asyncCB] |
---|
| 240 | set postResult [list PostStart] |
---|
| 241 | http::wait $t |
---|
| 242 | close $fp |
---|
| 243 | |
---|
| 244 | lappend testRes [http::status $t] $postResult |
---|
| 245 | removeFile outdata |
---|
| 246 | set testRes |
---|
| 247 | } {ok 122879 {Got 122880 bytes} ok {PostStart {Got 122880 bytes}}} |
---|
| 248 | # On Linux platforms when the client and server are on the same host, the |
---|
| 249 | # client is unable to read the server's response one it hits the write error. |
---|
| 250 | # The status is "eof". |
---|
| 251 | # On Windows, the http::wait procedure gets a "connection reset by peer" error |
---|
| 252 | # while reading the reply. |
---|
| 253 | test http-3.12 {http::geturl querychannel with aborted request} {nonPortable} { |
---|
| 254 | set query foo=bar |
---|
| 255 | set sep "" |
---|
| 256 | set i 0 |
---|
| 257 | # Create about 120K of query data |
---|
| 258 | while {$i < 14} { |
---|
| 259 | incr i |
---|
| 260 | append query $sep$query |
---|
| 261 | set sep & |
---|
| 262 | } |
---|
| 263 | set file [makeFile $query outdata] |
---|
| 264 | set fp [open $file] |
---|
| 265 | |
---|
| 266 | proc asyncCB {token} { |
---|
| 267 | global postResult |
---|
| 268 | lappend postResult [http::data $token] |
---|
| 269 | } |
---|
| 270 | proc postProgress {token x y} { |
---|
| 271 | global postProgress |
---|
| 272 | lappend postProgress $y |
---|
| 273 | } |
---|
| 274 | set postProgress {} |
---|
| 275 | # Now do async |
---|
| 276 | set postResult [list PostStart] |
---|
| 277 | if {[catch { |
---|
| 278 | set t [http::geturl $badposturl -querychannel $fp -command asyncCB \ |
---|
| 279 | -queryprogress postProgress] |
---|
| 280 | http::wait $t |
---|
| 281 | upvar #0 $t state |
---|
| 282 | } err]} { |
---|
| 283 | puts $::errorInfo |
---|
| 284 | error $err |
---|
| 285 | } |
---|
| 286 | |
---|
| 287 | removeFile outdata |
---|
| 288 | list [http::status $t] [http::code $t] |
---|
| 289 | } {ok {HTTP/1.0 200 Data follows}} |
---|
| 290 | test http-3.13 {http::geturl socket leak test} { |
---|
| 291 | set chanCount [llength [file channels]] |
---|
| 292 | for {set i 0} {$i < 3} {incr i} { |
---|
| 293 | catch {http::geturl $badurl -timeout 5000} |
---|
| 294 | } |
---|
| 295 | |
---|
| 296 | # No extra channels should be taken |
---|
| 297 | expr {[llength [file channels]] == $chanCount} |
---|
| 298 | } 1 |
---|
| 299 | test http-3.14 "http::geturl $fullurl" { |
---|
| 300 | set token [http::geturl $fullurl -validate 1] |
---|
| 301 | http::code $token |
---|
| 302 | } "HTTP/1.0 200 OK" |
---|
| 303 | test http-3.15 {http::geturl parse failures} -body { |
---|
| 304 | http::geturl "{invalid}:url" |
---|
| 305 | } -returnCodes error -result {Unsupported URL: {invalid}:url} |
---|
| 306 | test http-3.16 {http::geturl parse failures} -body { |
---|
| 307 | http::geturl http:relative/url |
---|
| 308 | } -returnCodes error -result {Unsupported URL: http:relative/url} |
---|
| 309 | test http-3.17 {http::geturl parse failures} -body { |
---|
| 310 | http::geturl /absolute/url |
---|
| 311 | } -returnCodes error -result {Missing host part: /absolute/url} |
---|
| 312 | test http-3.18 {http::geturl parse failures} -body { |
---|
| 313 | http::geturl http://somewhere:123456789/ |
---|
| 314 | } -returnCodes error -result {Invalid port number: 123456789} |
---|
| 315 | test http-3.19 {http::geturl parse failures} -body { |
---|
| 316 | http::geturl http://{user}@somewhere |
---|
| 317 | } -returnCodes error -result {Illegal characters in URL user} |
---|
| 318 | test http-3.20 {http::geturl parse failures} -body { |
---|
| 319 | http::geturl http://%user@somewhere |
---|
| 320 | } -returnCodes error -result {Illegal encoding character usage "%us" in URL user} |
---|
| 321 | test http-3.21 {http::geturl parse failures} -body { |
---|
| 322 | http::geturl http://somewhere/{path} |
---|
| 323 | } -returnCodes error -result {Illegal characters in URL path} |
---|
| 324 | test http-3.22 {http::geturl parse failures} -body { |
---|
| 325 | http::geturl http://somewhere/%path |
---|
| 326 | } -returnCodes error -result {Illegal encoding character usage "%pa" in URL path} |
---|
| 327 | test http-3.23 {http::geturl parse failures} -body { |
---|
| 328 | http::geturl http://somewhere/path?{query} |
---|
| 329 | } -returnCodes error -result {Illegal characters in URL path} |
---|
| 330 | test http-3.24 {http::geturl parse failures} -body { |
---|
| 331 | http::geturl http://somewhere/path?%query |
---|
| 332 | } -returnCodes error -result {Illegal encoding character usage "%qu" in URL path} |
---|
| 333 | |
---|
| 334 | test http-4.1 {http::Event} { |
---|
| 335 | set token [http::geturl $url -keepalive 0] |
---|
| 336 | upvar #0 $token data |
---|
| 337 | array set meta $data(meta) |
---|
| 338 | expr ($data(totalsize) == $meta(Content-Length)) |
---|
| 339 | } 1 |
---|
| 340 | test http-4.2 {http::Event} { |
---|
| 341 | set token [http::geturl $url] |
---|
| 342 | upvar #0 $token data |
---|
| 343 | array set meta $data(meta) |
---|
| 344 | string compare $data(type) [string trim $meta(Content-Type)] |
---|
| 345 | } 0 |
---|
| 346 | test http-4.3 {http::Event} { |
---|
| 347 | set token [http::geturl $url] |
---|
| 348 | http::code $token |
---|
| 349 | } {HTTP/1.0 200 Data follows} |
---|
| 350 | test http-4.4 {http::Event} { |
---|
| 351 | set testfile [makeFile "" testfile] |
---|
| 352 | set out [open $testfile w] |
---|
| 353 | set token [http::geturl $url -channel $out] |
---|
| 354 | close $out |
---|
| 355 | set in [open $testfile] |
---|
| 356 | set x [read $in] |
---|
| 357 | close $in |
---|
| 358 | removeFile $testfile |
---|
| 359 | set x |
---|
| 360 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 361 | <h1>Hello, World!</h1> |
---|
| 362 | <h2>GET $tail</h2> |
---|
| 363 | </body></html>" |
---|
| 364 | test http-4.5 {http::Event} { |
---|
| 365 | set testfile [makeFile "" testfile] |
---|
| 366 | set out [open $testfile w] |
---|
| 367 | set token [http::geturl $url -channel $out] |
---|
| 368 | close $out |
---|
| 369 | upvar #0 $token data |
---|
| 370 | removeFile $testfile |
---|
| 371 | expr $data(currentsize) == $data(totalsize) |
---|
| 372 | } 1 |
---|
| 373 | test http-4.6 {http::Event} { |
---|
| 374 | set testfile [makeFile "" testfile] |
---|
| 375 | set out [open $testfile w] |
---|
| 376 | set token [http::geturl $binurl -channel $out] |
---|
| 377 | close $out |
---|
| 378 | set in [open $testfile] |
---|
| 379 | fconfigure $in -translation binary |
---|
| 380 | set x [read $in] |
---|
| 381 | close $in |
---|
| 382 | removeFile $testfile |
---|
| 383 | set x |
---|
| 384 | } "$bindata[string trimleft $binurl /]" |
---|
| 385 | proc myProgress {token total current} { |
---|
| 386 | global progress httpLog |
---|
| 387 | if {[info exists httpLog] && $httpLog} { |
---|
| 388 | puts "progress $total $current" |
---|
| 389 | } |
---|
| 390 | set progress [list $total $current] |
---|
| 391 | } |
---|
| 392 | if 0 { |
---|
| 393 | # This test hangs on Windows95 because the client never gets EOF |
---|
| 394 | set httpLog 1 |
---|
| 395 | test http-4.6.1 {http::Event} knownBug { |
---|
| 396 | set token [http::geturl $url -blocksize 50 -progress myProgress] |
---|
| 397 | set progress |
---|
| 398 | } {111 111} |
---|
| 399 | } |
---|
| 400 | test http-4.7 {http::Event} { |
---|
| 401 | set token [http::geturl $url -keepalive 0 -progress myProgress] |
---|
| 402 | set progress |
---|
| 403 | } {111 111} |
---|
| 404 | test http-4.8 {http::Event} { |
---|
| 405 | set token [http::geturl $url] |
---|
| 406 | http::status $token |
---|
| 407 | } {ok} |
---|
| 408 | test http-4.9 {http::Event} { |
---|
| 409 | set token [http::geturl $url -progress myProgress] |
---|
| 410 | http::code $token |
---|
| 411 | } {HTTP/1.0 200 Data follows} |
---|
| 412 | test http-4.10 {http::Event} { |
---|
| 413 | set token [http::geturl $url -progress myProgress] |
---|
| 414 | http::size $token |
---|
| 415 | } {111} |
---|
| 416 | # Timeout cases |
---|
| 417 | # Short timeout to working server (the test server). This lets us try a |
---|
| 418 | # reset during the connection. |
---|
| 419 | test http-4.11 {http::Event} { |
---|
| 420 | set token [http::geturl $url -timeout 1 -keepalive 0 -command {#}] |
---|
| 421 | http::reset $token |
---|
| 422 | http::status $token |
---|
| 423 | } {reset} |
---|
| 424 | # Longer timeout with reset. |
---|
| 425 | test http-4.12 {http::Event} { |
---|
| 426 | set token [http::geturl $url/?timeout=10 -keepalive 0 -command {#}] |
---|
| 427 | http::reset $token |
---|
| 428 | http::status $token |
---|
| 429 | } {reset} |
---|
| 430 | # Medium timeout to working server that waits even longer. The timeout |
---|
| 431 | # hits while waiting for a reply. |
---|
| 432 | test http-4.13 {http::Event} { |
---|
| 433 | set token [http::geturl $url?timeout=30 -keepalive 0 -timeout 10 -command {#}] |
---|
| 434 | http::wait $token |
---|
| 435 | http::status $token |
---|
| 436 | } {timeout} |
---|
| 437 | # Longer timeout to good host, bad port, gets an error after the |
---|
| 438 | # connection "completes" but the socket is bad. |
---|
| 439 | test http-4.14 {http::Event} -body { |
---|
| 440 | set token [http::geturl $badurl/?timeout=10 -timeout 10000 -command \#] |
---|
| 441 | if {$token eq ""} { |
---|
| 442 | error "bogus return from http::geturl" |
---|
| 443 | } |
---|
| 444 | http::wait $token |
---|
| 445 | http::status $token |
---|
| 446 | # error code varies among platforms. |
---|
| 447 | } -returnCodes 1 -match regexp -result {(connect failed|couldn't open socket)} |
---|
| 448 | # Bogus host |
---|
| 449 | test http-4.15 {http::Event} -body { |
---|
| 450 | # This test may fail if you use a proxy server. That is to be |
---|
| 451 | # expected and is not a problem with Tcl. |
---|
| 452 | set token [http::geturl //not_a_host.tcl.tk -timeout 1000 -command \#] |
---|
| 453 | http::wait $token |
---|
| 454 | http::status $token |
---|
| 455 | # error codes vary among platforms. |
---|
| 456 | } -returnCodes 1 -match glob -result "couldn't open socket*" |
---|
| 457 | |
---|
| 458 | test http-5.1 {http::formatQuery} { |
---|
| 459 | http::formatQuery name1 value1 name2 "value two" |
---|
| 460 | } {name1=value1&name2=value%20two} |
---|
| 461 | # test http-5.2 obsoleted by 5.4 and 5.5 with http 2.5 |
---|
| 462 | test http-5.3 {http::formatQuery} { |
---|
| 463 | http::formatQuery lines "line1\nline2\nline3" |
---|
| 464 | } {lines=line1%0d%0aline2%0d%0aline3} |
---|
| 465 | test http-5.4 {http::formatQuery} { |
---|
| 466 | http::formatQuery name1 ~bwelch name2 \xa1\xa2\xa2 |
---|
| 467 | } {name1=~bwelch&name2=%c2%a1%c2%a2%c2%a2} |
---|
| 468 | test http-5.5 {http::formatQuery} { |
---|
| 469 | set enc [http::config -urlencoding] |
---|
| 470 | http::config -urlencoding iso8859-1 |
---|
| 471 | set res [http::formatQuery name1 ~bwelch name2 \xa1\xa2\xa2] |
---|
| 472 | http::config -urlencoding $enc |
---|
| 473 | set res |
---|
| 474 | } {name1=~bwelch&name2=%a1%a2%a2} |
---|
| 475 | |
---|
| 476 | test http-6.1 {http::ProxyRequired} { |
---|
| 477 | http::config -proxyhost [info hostname] -proxyport $port |
---|
| 478 | set token [http::geturl $url] |
---|
| 479 | http::wait $token |
---|
| 480 | http::config -proxyhost {} -proxyport {} |
---|
| 481 | upvar #0 $token data |
---|
| 482 | set data(body) |
---|
| 483 | } "<html><head><title>HTTP/1.0 TEST</title></head><body> |
---|
| 484 | <h1>Hello, World!</h1> |
---|
| 485 | <h2>GET http:$url</h2> |
---|
| 486 | </body></html>" |
---|
| 487 | |
---|
| 488 | test http-7.1 {http::mapReply} { |
---|
| 489 | http::mapReply "abc\$\[\]\"\\()\}\{" |
---|
| 490 | } {abc%24%5b%5d%22%5c%28%29%7d%7b} |
---|
| 491 | test http-7.2 {http::mapReply} { |
---|
| 492 | # RFC 2718 specifies that we pass urlencoding on utf-8 chars by default, |
---|
| 493 | # so make sure this gets converted to utf-8 then urlencoded. |
---|
| 494 | http::mapReply "\u2208" |
---|
| 495 | } {%e2%88%88} |
---|
| 496 | test http-7.3 {http::formatQuery} { |
---|
| 497 | set enc [http::config -urlencoding] |
---|
| 498 | # this would be reverting to http <=2.4 behavior |
---|
| 499 | http::config -urlencoding "" |
---|
| 500 | set res [list [catch {http::mapReply "\u2208"} msg] $msg] |
---|
| 501 | http::config -urlencoding $enc |
---|
| 502 | set res |
---|
| 503 | } [list 1 "can't read \"formMap(\u2208)\": no such element in array"] |
---|
| 504 | test http-7.4 {http::formatQuery} { |
---|
| 505 | set enc [http::config -urlencoding] |
---|
| 506 | # this would be reverting to http <=2.4 behavior w/o errors |
---|
| 507 | # (unknown chars become '?') |
---|
| 508 | http::config -urlencoding "iso8859-1" |
---|
| 509 | set res [http::mapReply "\u2208"] |
---|
| 510 | http::config -urlencoding $enc |
---|
| 511 | set res |
---|
| 512 | } {%3f} |
---|
| 513 | |
---|
| 514 | # cleanup |
---|
| 515 | catch {unset url} |
---|
| 516 | catch {unset badurl} |
---|
| 517 | catch {unset port} |
---|
| 518 | catch {unset data} |
---|
| 519 | if {[info exists httpthread]} { |
---|
| 520 | testthread send -async $httpthread { |
---|
| 521 | testthread exit |
---|
| 522 | } |
---|
| 523 | } else { |
---|
| 524 | close $listen |
---|
| 525 | } |
---|
| 526 | |
---|
| 527 | if {[info exists removeHttpd]} { |
---|
| 528 | removeFile $httpdFile |
---|
| 529 | } |
---|
| 530 | |
---|
| 531 | rename bgerror {} |
---|
| 532 | ::tcltest::cleanupTests |
---|