summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraspect <aspect+tclcore@abstracted-spleen.org>2017-02-12 12:57:29 (GMT)
committeraspect <aspect+tclcore@abstracted-spleen.org>2017-02-12 12:57:29 (GMT)
commitc8646e5c72e90d6e78802f41ce39fa603e32e6b3 (patch)
treeffe35b39b3c3c39397510c34e6bbb7c40692ceeb
parentfca34fb8d0eb7f4bcc1395c00b97289685745ff7 (diff)
downloadtcl-c8646e5c72e90d6e78802f41ce39fa603e32e6b3.zip
tcl-c8646e5c72e90d6e78802f41ce39fa603e32e6b3.tar.gz
tcl-c8646e5c72e90d6e78802f41ce39fa603e32e6b3.tar.bz2
fix chan leak with http keepalive vs close (bug [6ca52aec14])
-rw-r--r--library/http/http.tcl7
-rw-r--r--tests/http.test8
2 files changed, 12 insertions, 3 deletions
diff --git a/library/http/http.tcl b/library/http/http.tcl
index ccd4cd1..19799b9 100644
--- a/library/http/http.tcl
+++ b/library/http/http.tcl
@@ -197,9 +197,10 @@ proc http::Finish {token {errormsg ""} {skipCB 0}} {
set state(error) [list $errormsg $errorInfo $errorCode]
set state(status) "error"
}
- if {
- ($state(status) eq "timeout") || ($state(status) eq "error") ||
- ([info exists state(connection)] && ($state(connection) eq "close"))
+ if { ($state(status) eq "timeout")
+ || ($state(status) eq "error")
+ || ([info exists state(-keepalive)] && !$state(-keepalive))
+ || ([info exists state(connection)] && ($state(connection) eq "close"))
} {
CloseSocket $state(sock) $token
}
diff --git a/tests/http.test b/tests/http.test
index 12ad475..d7e42c2 100644
--- a/tests/http.test
+++ b/tests/http.test
@@ -592,6 +592,14 @@ test http-4.15 {http::Event} -body {
} -cleanup {
catch {http::cleanup $token}
} -returnCodes 1 -match glob -result "couldn't open socket*"
+test http-1.15 {Leak with Close vs Keepalive (bug [6ca52aec14]} -body {
+ set before [chan names]
+ set token [http::geturl $url -headers {X-Connection keep-alive}]
+ http::cleanup $token
+ update
+ set after [chan names]
+ expr {$before eq $after}
+} -result 1
test http-5.1 {http::formatQuery} {
http::formatQuery name1 value1 name2 "value two"