Well, this global page URL is really a crok that must be fixed, frankly.
At the moment I don't remember why Doc_SetCookie cannot just call
Httpd_SetCookie instead of saving the cookie state in the page(set-cookie)
variable.
Oh yes, because it doesn't have access to the socket handle. You could get
this from the Url(sock) or env(HTTP_CHANNEL) variables, but these are globals
that
also suffer when you http::geturl back into yourself. So, you could modify
Doc_SetCookie to call Httpd_SetCookie, but you'd still need to wrap up
the http::geturl call with something that saved/restored Url(sock) or whatever
you were using in Doc_SetCookie.
The only good way to get a clean interpreter is to use threads, but that may
not jive with the rest of your application and C extensions.
>>>Ted Dunning said:
>
>
> We have run into an interesting snag using tclhttpd for a substantial system
> that we are about to release. We use tclhttpd 3.0.3 on tcl 8.3.1. We have
> http package version 2.3. Not surprisingly, this is an eleventh hour
> situation as all intriguing bugs ultimately are.
>
> The problem is that we have a tclhttpd server that does some work in a
> template file (essentially a .tml file). As part of its work, it needs to
> consult other servers via http transactions. Thus it calls http::geturl and
> goes on about using the resulting data.
>
> The problem occurs during the geturl call itself. The problem is especially
> evident if the URL we are accessing happens by accident or convenience to be
> on the server calling geturl itself. Of course, in a perfect world it
> shouldn't matter where this URL is, and I think that the only interesting
> aspect of this case is that a request comes in (from ourselves!) at just
> about the same time that geturl enters the event loop. In the case of the
> circular access, this is not an accident, but in general it could have been
> anybody who coincidently gave us that request.
>
> Anyway, when that other request comes in, the page array gets smashed and in
> particular page(set-cookie) gets unset. When we come back from geturl, we
> continue on our business and eventually the code in DocHandle (in doc.tcl)
> looks to see if we set a cookie and explodes because the set-cookie entry in
> page is not set. Of course, the .tml page in question NEVER EVEN knew about
> the existence page(set-cookie).
>
> Soooo.... the questions I have are (a) what to do in the short run and (b)
> how (or even whether) tclhttp should be changed to avoid this issue.
>
> a.1 we could save Url and page ourselves and restore them after the geturl
> call (ick!, but may work)
>
> a.2 I could hack doc.tcl not to unset page(set-cookie) and just hope that
> nothing else important is in Url and page. (This seems highly unlikely to
> work since the socket entry in Url is so crucial to anything working at all.
>
> a.3 I could possibly tell tclhttpd to use a separate thread for any URL that
> calls http::geturl. THis might decouple the namespaces enough to be safe.
> I wouldn't bet on this either. It might only fix the problem in tests and I
> would never know.
>
> a.4 ???
>
> on the long term issues,
>
> b.1 I thought that tclhttpd went to some trouble to use separate
> interpreters to avoid this sort of issue. What is happening here? Why
> isn't the name space for the recursive call separate from the namespace for
> the outer call?
>
> b.2 If the namespace used by a request is not intended to be separated from
> other requests, how can we separate different copies of page and Url for
> long running and overlapping requests?
>
> b.3 Is this just a problem for recursive calls, but not for calls that just
> happen to come in at the same time? If so, how can we know this for sure?
> Can we port the solution for simultaneous calls to the recursive case?
>
>
-- Brent Welch <[EMAIL PROTECTED]>
http://www.ajubasolutions.com
Scriptics changes to Ajuba Solutions
scriptics.com => ajubasolutions.com