Tcl Source Code

View Ticket
Login
Ticket UUID: c11a51c482ba5720793d44340f76934c59718780
Title: Configuration race condition in accept types
Type: Bug Version: http 2.8.8
Submitter: dkf Created on: 2014-07-06 17:13:33
Subsystem: 29. http Package Assigned To: nobody
Priority: 5 Medium Severity: Minor
Status: Closed Last Modified: 2015-05-18 07:53:54
Resolution: Fixed Closed By: dkf
    Closed on: 2015-05-18 07:53:54
Description: (text/html)
If you're using the http package to do REST with content type negotiation, you need to configure the package's <tt>Accept:</tt> types mechanism from time to time. This is a bit of a broken API, in that there's no option to override from options passed to <tt>http::geturl</tt>. This is not the feature change I'm requesting.
<p>
<i>However,</i> if you're also using asynchronous connecting then you've got an additional problem in that the configuration of the <tt>-accept</tt> option is only read when the connection is made; two connections that require different <tt>Accept:</tt> headers will have a race condition between the two, and so which is used will be pretty much random. <b>This Is Wrong.</b> This is the bug I'm reporting.
<p>
Suggested fix, <i>without fixing the original API botch,</i> is to take a copy of <tt>$http(-accept)</tt> into the <tt>state</tt> array during <tt>http::geturl</tt> so that the value used in <tt>http::Connected</tt> is predictable.
<p>
See also: <a href="http://www.kroc.tk/forum/index.php?t=msg&th=1041&goto=5213&#msg_5213">this thread</a> with the comment that prompted me to look into the potential feature request, and discover the race:
<blockquote><tt><i>Ok well the final solution was that using -headers in the http::geturl doesn't seem to work when setting an "Accept" header - which kind of sucks…</i></tt></blockquote>
User Comments: dkf added on 2015-05-18 07:53:54: (text/html)
Both kinds of fixes applied. The value of the <tt>-accept</tt> option is now saved during <code>http::geturl</code>, and the existing <tt>-headers</tt> can now override it.