http.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:17k
源码类别:

通讯编程

开发平台:

Visual C++

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